Skip to content

Commit 0f89109

Browse files
committed
Updating Table and Column types to add Table.TemporalType and Column.GeneratedAlwaysType.
1 parent 055148a commit 0f89109

File tree

1 file changed

+126
-83
lines changed

1 file changed

+126
-83
lines changed

EntityFramework.Reverse.POCO.Generator/EF.Reverse.POCO.Core.ttinclude

Lines changed: 126 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105
public static bool UseMappingTables;
106106
public static bool UsePropertyInitializers;
107107
public static bool IsSqlCe;
108+
public static bool TemporalTableSupport;
108109
public static string FileExtension = ".cs";
109110
public static bool UsePascalCase;
110111
public static bool UsePrivateSetterForComputedColumns;
@@ -752,7 +753,7 @@
752753
catch(Exception x)
753754
{
754755
PrintError( "Failed to read database schema in LoadTables().", x );
755-
return new Tables();
756+
return new Tables();
756757
}
757758
}
758759

@@ -973,6 +974,9 @@
973974
public bool AllowEmptyStrings = true;
974975

975976
public bool IsIdentity;
977+
public bool IsRowGuid;
978+
public bool IsComputed;
979+
public ColumnGeneratedAlwaysType GeneratedAlwaysType;
976980
public bool IsNullable;
977981
public bool IsPrimaryKey;
978982
public bool IsUniqueConstraint;
@@ -1043,7 +1047,10 @@
10431047
inlineComments += ". " + ExtendedProperty;
10441048
}
10451049
var initialization = Settings.UsePropertyInitializers ? (Default == string.Empty ? "" : string.Format(" = {0};", Default)) : "";
1046-
Entity = string.Format("public {0}{1} {2} {{ get; {3}set; }}{4}{5}", (OverrideModifier ? "override " : ""), WrapIfNullable(PropertyType, this), NameHumanCase, Settings.UsePrivateSetterForComputedColumns && IsComputed() ? "private " : string.Empty, initialization, inlineComments);
1050+
Entity = string.Format(
1051+
"public {0}{1} {2} {{ get; {3}set; }}{4}{5}",
1052+
(OverrideModifier ? "override " : ""), WrapIfNullable(PropertyType, this), NameHumanCase, Settings.UsePrivateSetterForComputedColumns && IsComputed ? "private " : string.Empty, initialization, inlineComments
1053+
);
10471054
}
10481055

10491056
private string WrapIfNullable(string propType, Column col)
@@ -1053,11 +1060,6 @@
10531060
return string.Format(Settings.NullableShortHand ? "{0}?" : "System.Nullable<{0}>",propType);
10541061
}
10551062

1056-
private bool IsComputed()
1057-
{
1058-
return IsStoreGenerated && !IsIdentity;
1059-
}
1060-
10611063
private void SetupConfig()
10621064
{
10631065
DataAnnotations = new List<string>();
@@ -1075,7 +1077,7 @@
10751077
else
10761078
databaseGeneratedOption = string.Format(".HasDatabaseGeneratedOption({0}DatabaseGeneratedOption.Identity)", schemaReference);
10771079
}
1078-
else if(IsComputed())
1080+
else if(IsComputed)
10791081
{
10801082
if(Settings.UseDataAnnotations)
10811083
DataAnnotations.Add("DatabaseGenerated(DatabaseGeneratedOption.Computed)");
@@ -1115,7 +1117,7 @@
11151117
}
11161118
else
11171119
{
1118-
if (!IsComputed() && (Settings.UseDataAnnotations || Settings.UseDataAnnotationsWithFluent))
1120+
if (!IsComputed && (Settings.UseDataAnnotations || Settings.UseDataAnnotationsWithFluent))
11191121
{
11201122
if (PropertyType.Equals("string", StringComparison.InvariantCultureIgnoreCase) && this.AllowEmptyStrings)
11211123
{
@@ -1735,7 +1737,7 @@ WHERE
17351737

17361738

17371739
CREATE NONCLUSTERED INDEX IX_EfPoco_Columns
1738-
ON dbo.#Columns (TABLE_NAME)
1740+
ON dbo.#Columns (TABLE_NAME)
17391741
INCLUDE (
17401742
TABLE_SCHEMA,COLUMN_NAME,ORDINAL_POSITION,COLUMN_DEFAULT,IS_NULLABLE,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_SCALE,DATETIME_PRECISION,
17411743
schema_id, table_object_id, view_object_id,
@@ -1747,9 +1749,9 @@ ON dbo.#Columns (TABLE_NAME)
17471749
-----------
17481750
SELECT
17491751
u.TABLE_SCHEMA,
1750-
u.TABLE_NAME,
1751-
u.COLUMN_NAME,
1752-
u.ORDINAL_POSITION
1752+
u.TABLE_NAME,
1753+
u.COLUMN_NAME,
1754+
u.ORDINAL_POSITION
17531755
INTO
17541756
#PrimaryKeys
17551757
FROM
@@ -1764,9 +1766,9 @@ WHERE
17641766
CONSTRAINT_TYPE = 'PRIMARY KEY';
17651767

17661768
SELECT DISTINCT
1767-
u.TABLE_SCHEMA,
1768-
u.TABLE_NAME,
1769-
u.COLUMN_NAME
1769+
u.TABLE_SCHEMA,
1770+
u.TABLE_NAME,
1771+
u.COLUMN_NAME
17701772
INTO
17711773
#ForeignKeys
17721774
FROM
@@ -1784,19 +1786,19 @@ WHERE
17841786

17851787
SELECT
17861788
c.TABLE_SCHEMA AS SchemaName,
1787-
c.TABLE_NAME AS TableName,
1788-
t.TABLE_TYPE AS TableType,
1789+
c.TABLE_NAME AS TableName,
1790+
t.TABLE_TYPE AS TableType,
17891791
CONVERT( tinyint, ISNULL( tt.temporal_type, 0 ) ) AS TableTemporalType,
17901792

1791-
c.ORDINAL_POSITION AS Ordinal,
1792-
c.COLUMN_NAME AS ColumnName,
1793+
c.ORDINAL_POSITION AS Ordinal,
1794+
c.COLUMN_NAME AS ColumnName,
17931795
c.is_nullable AS IsNullable,
1794-
DATA_TYPE AS TypeName,
1796+
DATA_TYPE AS TypeName,
17951797
ISNULL(CHARACTER_MAXIMUM_LENGTH, 0) AS [MaxLength],
17961798
CAST(ISNULL(NUMERIC_PRECISION, 0) AS INT) AS [Precision],
1797-
ISNULL(COLUMN_DEFAULT, '') AS [Default],
1798-
CAST(ISNULL(DATETIME_PRECISION, 0) AS INT) AS DateTimePrecision,
1799-
ISNULL(NUMERIC_SCALE, 0) AS Scale,
1799+
ISNULL(COLUMN_DEFAULT, '') AS [Default],
1800+
CAST(ISNULL(DATETIME_PRECISION, 0) AS INT) AS DateTimePrecision,
1801+
ISNULL(NUMERIC_SCALE, 0) AS Scale,
18001802

18011803
c.is_identity AS IsIdentity,
18021804
c.is_rowguidcol AS IsRowGuid,
@@ -1818,7 +1820,7 @@ SELECT
18181820
) AS IsStoreGenerated,
18191821

18201822
CONVERT( bit, ISNULL( pk.ORDINAL_POSITION, 0 ) ) AS PrimaryKey,
1821-
ISNULL(pk.ORDINAL_POSITION, 0) PrimaryKeyOrdinal,
1823+
ISNULL(pk.ORDINAL_POSITION, 0) PrimaryKeyOrdinal,
18221824
CONVERT( bit, CASE WHEN fk.COLUMN_NAME IS NOT NULL THEN 1 ELSE 0 END ) AS IsForeignKey
18231825

18241826
FROM
@@ -1862,29 +1864,29 @@ IF OBJECT_ID('tempdb..#SynonymTargets') IS NOT NULL DROP TABLE #SynonymTargets;
18621864
-- Synonyms
18631865
-- Create the #SynonymDetails temp table structure for later use
18641866
SELECT TOP (0)
1865-
sc.name AS SchemaName,
1866-
sn.name AS TableName,
1867-
'SN' AS TableType,
1868-
COLUMNPROPERTY(c.object_id, c.name, 'ordinal') AS Ordinal,
1869-
c.name AS ColumnName,
1870-
c.is_nullable AS IsNullable,
1871-
ISNULL(TYPE_NAME(c.system_type_id), t.name) AS TypeName,
1872-
ISNULL(COLUMNPROPERTY(c.object_id, c.name, 'charmaxlen'), 0) AS MaxLength,
1867+
sc.name AS SchemaName,
1868+
sn.name AS TableName,
1869+
'SN' AS TableType,
1870+
COLUMNPROPERTY(c.object_id, c.name, 'ordinal') AS Ordinal,
1871+
c.name AS ColumnName,
1872+
c.is_nullable AS IsNullable,
1873+
ISNULL(TYPE_NAME(c.system_type_id), t.name) AS TypeName,
1874+
ISNULL(COLUMNPROPERTY(c.object_id, c.name, 'charmaxlen'), 0) AS MaxLength,
18731875
CAST(ISNULL(CONVERT(TINYINT, CASE WHEN c.system_type_id IN (48, 52, 56, 59, 60, 62, 106, 108, 122, 127) THEN c.precision END), 0) AS INT) AS Precision,
1874-
ISNULL(CONVERT(NVARCHAR(4000), OBJECT_DEFINITION(c.default_object_id)), '') AS [Default],
1876+
ISNULL(CONVERT(NVARCHAR(4000), OBJECT_DEFINITION(c.default_object_id)), '') AS [Default],
18751877
CAST(ISNULL(CONVERT(SMALLINT, CASE WHEN c.system_type_id IN (40, 41, 42, 43, 58, 61) THEN ODBCSCALE(c.system_type_id, c.scale) END), 0) AS INT) AS DateTimePrecision,
18761878
ISNULL(CONVERT(INT, CASE WHEN c.system_type_id IN (40, 41, 42, 43, 58, 61) THEN NULL ELSE ODBCSCALE(c.system_type_id, c.scale) END), 0) AS Scale,
1877-
CAST(COLUMNPROPERTY(OBJECT_ID(sn.base_object_name), c.NAME, 'IsIdentity') AS BIT) AS IsIdentity,
1879+
CAST(COLUMNPROPERTY(OBJECT_ID(sn.base_object_name), c.NAME, 'IsIdentity') AS BIT) AS IsIdentity,
18781880
CAST(CASE
18791881
WHEN COLUMNPROPERTY(OBJECT_ID(QUOTENAME(sc.NAME) + '.' + QUOTENAME(o.NAME)), c.NAME, 'IsIdentity') = 1 THEN 1
1880-
WHEN COLUMNPROPERTY(OBJECT_ID(QUOTENAME(sc.NAME) + '.' + QUOTENAME(o.NAME)), c.NAME, 'IsComputed') = 1 THEN 1
1881-
WHEN COLUMNPROPERTY(OBJECT_ID(QUOTENAME(sc.NAME) + '.' + QUOTENAME(o.NAME)), c.NAME, 'GeneratedAlwaysType') > 0 THEN 1
1882-
WHEN ISNULL(TYPE_NAME(c.system_type_id), t.NAME) = 'TIMESTAMP' THEN 1
1882+
WHEN COLUMNPROPERTY(OBJECT_ID(QUOTENAME(sc.NAME) + '.' + QUOTENAME(o.NAME)), c.NAME, 'IsComputed') = 1 THEN 1
1883+
WHEN COLUMNPROPERTY(OBJECT_ID(QUOTENAME(sc.NAME) + '.' + QUOTENAME(o.NAME)), c.NAME, 'GeneratedAlwaysType') > 0 THEN 1
1884+
WHEN ISNULL(TYPE_NAME(c.system_type_id), t.NAME) = 'TIMESTAMP' THEN 1
18831885
WHEN ISNULL(TYPE_NAME(c.system_type_id), t.NAME) = 'UNIQUEIDENTIFIER' AND LOWER(ISNULL(CONVERT(NVARCHAR(4000), OBJECT_DEFINITION(c.default_object_id)), '')) LIKE '%newsequentialid%' THEN 1
1884-
ELSE 0
1885-
END AS BIT) AS IsStoreGenerated,
1886+
ELSE 0
1887+
END AS BIT) AS IsStoreGenerated,
18861888
CAST(CASE WHEN pk.ORDINAL_POSITION IS NULL THEN 0 ELSE 1 END AS BIT) AS PrimaryKey,
1887-
ISNULL(pk.ORDINAL_POSITION, 0) PrimaryKeyOrdinal,
1889+
ISNULL(pk.ORDINAL_POSITION, 0) PrimaryKeyOrdinal,
18881890
CAST(CASE WHEN fk.COLUMN_NAME IS NULL THEN 0 ELSE 1 END AS BIT) AS IsForeignKey
18891891
INTO
18901892
#SynonymDetails
@@ -1898,9 +1900,9 @@ FROM
18981900
(
18991901
SELECT
19001902
u.TABLE_SCHEMA,
1901-
u.TABLE_NAME,
1902-
u.COLUMN_NAME,
1903-
u.ORDINAL_POSITION
1903+
u.TABLE_NAME,
1904+
u.COLUMN_NAME,
1905+
u.ORDINAL_POSITION
19041906
FROM
19051907
INFORMATION_SCHEMA.KEY_COLUMN_USAGE u
19061908
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc ON u.TABLE_SCHEMA = tc.CONSTRAINT_SCHEMA AND u.TABLE_NAME = tc.TABLE_NAME AND u.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
@@ -1912,9 +1914,9 @@ FROM
19121914
LEFT OUTER JOIN
19131915
(
19141916
SELECT DISTINCT
1915-
u.TABLE_SCHEMA,
1916-
u.TABLE_NAME,
1917-
u.COLUMN_NAME
1917+
u.TABLE_SCHEMA,
1918+
u.TABLE_NAME,
1919+
u.COLUMN_NAME
19181920
FROM
19191921
INFORMATION_SCHEMA.KEY_COLUMN_USAGE u
19201922
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc ON u.TABLE_SCHEMA = tc.CONSTRAINT_SCHEMA AND u.TABLE_NAME = tc.TABLE_NAME AND u.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
@@ -1959,7 +1961,7 @@ SELECT
19591961
c.DATA_TYPE IN ( 'rowversion', 'timestamp' ) OR
19601962
( c.DATA_TYPE = 'uniqueidentifier' AND c.COLUMN_DEFAULT LIKE '%newsequentialid%' )
19611963
THEN 1
1962-
ELSE 0
1964+
ELSE 0
19631965
END
19641966
) AS IsStoreGenerated,
19651967

@@ -1979,9 +1981,9 @@ FROM
19791981
(
19801982
SELECT
19811983
u.TABLE_SCHEMA,
1982-
u.TABLE_NAME,
1983-
u.COLUMN_NAME,
1984-
u.ORDINAL_POSITION
1984+
u.TABLE_NAME,
1985+
u.COLUMN_NAME,
1986+
u.ORDINAL_POSITION
19851987
FROM
19861988
INFORMATION_SCHEMA.KEY_COLUMN_USAGE u
19871989
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc ON u.TABLE_SCHEMA = tc.CONSTRAINT_SCHEMA AND u.TABLE_NAME = tc.TABLE_NAME AND u.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
@@ -1994,10 +1996,10 @@ FROM
19941996

19951997
LEFT OUTER JOIN
19961998
(
1997-
SELECT DISTINCT
1998-
u.TABLE_SCHEMA,
1999-
u.TABLE_NAME,
2000-
u.COLUMN_NAME
1999+
SELECT DISTINCT
2000+
u.TABLE_SCHEMA,
2001+
u.TABLE_NAME,
2002+
u.COLUMN_NAME
20012003
FROM
20022004
INFORMATION_SCHEMA.KEY_COLUMN_USAGE u
20032005
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc ON
@@ -2027,14 +2029,14 @@ WHERE
20272029
-- Pull details about the synonym target from each database being referenced
20282030
SELECT
20292031
sc.name AS SynonymSchemaName,
2030-
sn.name AS SynonymName,
2031-
sn.object_id,
2032-
sn.base_object_name,
2033-
OBJECT_ID(sn.base_object_name) AS base_object_id,
2034-
PARSENAME(sn.base_object_name, 1) AS ObjectName,
2035-
ISNULL(PARSENAME(sn.base_object_name, 2), sc.name) AS SchemaName,
2036-
ISNULL(PARSENAME(sn.base_object_name, 3), DB_NAME()) AS DatabaseName,
2037-
PARSENAME(sn.base_object_name, 4) AS ServerName
2032+
sn.name AS SynonymName,
2033+
sn.object_id,
2034+
sn.base_object_name,
2035+
OBJECT_ID(sn.base_object_name) AS base_object_id,
2036+
PARSENAME(sn.base_object_name, 1) AS ObjectName,
2037+
ISNULL(PARSENAME(sn.base_object_name, 2), sc.name) AS SchemaName,
2038+
ISNULL(PARSENAME(sn.base_object_name, 3), DB_NAME()) AS DatabaseName,
2039+
PARSENAME(sn.base_object_name, 4) AS ServerName
20382040
INTO
20392041
#SynonymTargets
20402042
FROM
@@ -2681,6 +2683,14 @@ SELECT SERVERPROPERTY('Edition') AS Edition,
26812683
else
26822684
Cmd.CommandTimeout = Settings.CommandTimeout;
26832685

2686+
if (!Settings.TemporalTableSupport)
2687+
{
2688+
Cmd.CommandText = Cmd.CommandText
2689+
.Replace("[sc].[generated_always_type]", "0" )
2690+
.Replace("[c].[generated_always_type]", "0" )
2691+
.Replace("[st].[temporal_type]", "0" );
2692+
}
2693+
26842694
using(var rdr = Cmd.ExecuteReader())
26852695
{
26862696
var rxClean = new Regex("^(event|Equals|GetHashCode|GetType|ToString|repo|Save|IsNew|Insert|Update|Delete|Exists|SingleOrDefault|Single|First|FirstOrDefault|Fetch|Page|Query)$");
@@ -2702,11 +2712,12 @@ SELECT SERVERPROPERTY('Edition') AS Edition,
27022712
table = result.Find(x => x.Name == tableName && x.Schema == schema);
27032713
if(table == null)
27042714
{
2705-
table = new Table
2715+
table = new Table
27062716
{
27072717
Name = tableName,
27082718
Schema = schema,
27092719
IsView = string.Compare(rdr["TableType"].ToString().Trim(), "View", StringComparison.OrdinalIgnoreCase) == 0,
2720+
TemporalType = (TableTemporalType)(Byte)rdr["TableTemporalType"],
27102721

27112722
// Will be set later
27122723
HasForeignKey = false,
@@ -3367,28 +3378,45 @@ SELECT SERVERPROPERTY('Edition') AS Edition,
33673378
if(rdr == null)
33683379
throw new ArgumentNullException("rdr");
33693380

3370-
string typename = rdr["TypeName"].ToString().Trim().ToLower();
3371-
var scale = (int) rdr["Scale"];
3372-
var precision = (int) rdr["Precision"];
3381+
string typename = rdr["TypeName"].ToString().Trim().ToLower();
3382+
Int32 rdrScale = (int)rdr["Scale"];
3383+
3384+
Boolean rdrIsNullable = (Boolean)rdr["IsNullable"];
3385+
Int32 rdrMaxLength = (int)rdr["MaxLength"];
3386+
Int32 rdrDtp = (int)rdr["DateTimePrecision"];
3387+
Int32 rdrPrecision = (int)rdr["Precision"];
3388+
Boolean rdrIsIdentity = (Boolean)rdr["IsIdentity"];
3389+
Boolean rdrIsComputed = (Boolean)rdr["IsComputed"];
3390+
Boolean rdrIsRowGuid = (Boolean)rdr["IsRowGuid"];
3391+
Byte rdrGat = (Byte)rdr["GeneratedAlwaysType"];
3392+
Boolean rdrIsg = (Boolean)rdr["IsStoreGenerated"];
3393+
Int32 rdrPko = (int)rdr["PrimaryKeyOrdinal"];
3394+
Boolean rdrIsPk = (Boolean)rdr["PrimaryKey"];
3395+
Boolean rdrIsFk = (Boolean)rdr["IsForeignKey"];
33733396

33743397
var col = new Column
33753398
{
3376-
Name = rdr["ColumnName"].ToString().Trim(),
3377-
SqlPropertyType = typename,
3378-
PropertyType = GetPropertyType(typename),
3379-
MaxLength = (int)rdr["MaxLength"],
3380-
Precision = precision,
3381-
Default = rdr["Default"].ToString().Trim(),
3382-
DateTimePrecision = (int)rdr["DateTimePrecision"],
3383-
Scale = scale,
3384-
Ordinal = (int)rdr["Ordinal"],
3385-
IsIdentity = rdr["IsIdentity"].ToString().Trim().ToLower() == "true",
3386-
IsNullable = rdr["IsNullable"].ToString().Trim().ToLower() == "true",
3387-
IsStoreGenerated = rdr["IsStoreGenerated"].ToString().Trim().ToLower() == "true",
3388-
IsPrimaryKey = rdr["PrimaryKey"].ToString().Trim().ToLower() == "true",
3389-
PrimaryKeyOrdinal = (int)rdr["PrimaryKeyOrdinal"],
3390-
IsForeignKey = rdr["IsForeignKey"].ToString().Trim().ToLower() == "true",
3391-
ParentTable = table
3399+
Ordinal = (int)rdr["Ordinal"],
3400+
Name = rdr["ColumnName"].ToString().Trim(),
3401+
IsNullable = rdrIsNullable,
3402+
PropertyType = GetPropertyType(typename),
3403+
SqlPropertyType = typename,
3404+
MaxLength = rdrMaxLength,
3405+
Precision = rdrPrecision,
3406+
Default = rdr["Default"].ToString().Trim(),
3407+
DateTimePrecision = rdrDtp,
3408+
Scale = rdrScale,
3409+
3410+
IsIdentity = rdrIsIdentity,
3411+
IsRowGuid = rdrIsRowGuid,
3412+
IsComputed = rdrIsComputed,
3413+
GeneratedAlwaysType = (ColumnGeneratedAlwaysType)rdrGat,
3414+
IsStoreGenerated = rdrIsg,
3415+
3416+
IsPrimaryKey = rdrIsPk,
3417+
PrimaryKeyOrdinal = rdrPko,
3418+
IsForeignKey = rdrIsFk,
3419+
ParentTable = table
33923420
};
33933421

33943422
if (col.MaxLength == -1 && (col.SqlPropertyType.EndsWith("varchar", StringComparison.InvariantCultureIgnoreCase) || col.SqlPropertyType.EndsWith("varbinary", StringComparison.InvariantCultureIgnoreCase)))
@@ -3714,6 +3742,20 @@ SELECT SERVERPROPERTY('Edition') AS Edition,
37143742
public bool IsClustered;
37153743
}
37163744

3745+
public enum TableTemporalType
3746+
{
3747+
None,
3748+
Verioned,
3749+
History
3750+
}
3751+
3752+
public enum ColumnGeneratedAlwaysType
3753+
{
3754+
NotApplicable = 0,
3755+
AsRowStart = 1,
3756+
AsRowEnd = 2
3757+
}
3758+
37173759
public class Table
37183760
{
37193761
public string Name;
@@ -3728,6 +3770,7 @@ SELECT SERVERPROPERTY('Edition') AS Edition,
37283770
public bool HasForeignKey;
37293771
public bool HasNullableColumns;
37303772
public bool HasPrimaryKey;
3773+
public TableTemporalType TemporalType;
37313774

37323775
public List<Column> Columns;
37333776
public List<PropertyAndComments> ReverseNavigationProperty;

0 commit comments

Comments
 (0)