Skip to content

Commit 1ee56b0

Browse files
authored
Merge pull request #444 from Jehoel/temporal-tables-and-generated-cols
Temporal tables and generated cols (synonym bugfixes)
2 parents 3e3624e + e30cb90 commit 1ee56b0

File tree

1 file changed

+50
-32
lines changed

1 file changed

+50
-32
lines changed

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

Lines changed: 50 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1745,9 +1745,8 @@ CREATE NONCLUSTERED INDEX IX_EfPoco_Columns
17451745
is_identity,is_rowguidcol,is_computed,generated_always_type
17461746
);
17471747

1748-
--SELECT * FROM #Columns;
1749-
17501748
-----------
1749+
17511750
SELECT
17521751
u.TABLE_SCHEMA,
17531752
u.TABLE_NAME,
@@ -1850,11 +1849,6 @@ FROM
18501849
FROM
18511850
sys.tables AS st
18521851
) AS tt ON c.table_object_id = tt.object_id
1853-
1854-
ORDER BY
1855-
c.TABLE_SCHEMA,
1856-
c.TABLE_NAME,
1857-
c.ORDINAL_POSITION;
18581852
";
18591853

18601854
private const string SynonymTableSQLSetup = @"
@@ -1868,6 +1862,7 @@ SELECT TOP (0)
18681862
sc.name AS SchemaName,
18691863
sn.name AS TableName,
18701864
'SN' AS TableType,
1865+
CONVERT( tinyint, 0 ) AS TableTemporalType,
18711866
COLUMNPROPERTY(c.object_id, c.name, 'ordinal') AS Ordinal,
18721867
c.name AS ColumnName,
18731868
c.is_nullable AS IsNullable,
@@ -1877,7 +1872,10 @@ SELECT TOP (0)
18771872
ISNULL(CONVERT(NVARCHAR(4000), OBJECT_DEFINITION(c.default_object_id)), '') AS [Default],
18781873
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,
18791874
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,
1880-
CAST(COLUMNPROPERTY(OBJECT_ID(sn.base_object_name), c.NAME, 'IsIdentity') AS BIT) AS IsIdentity,
1875+
c.is_identity AS IsIdentity,
1876+
c.is_rowguidcol AS IsRowGuid,
1877+
c.is_computed AS IsComputed,
1878+
CONVERT( tinyint, [c].[generated_always_type] ) AS GeneratedAlwaysType,
18811879
CAST(CASE
18821880
WHEN COLUMNPROPERTY(OBJECT_ID(QUOTENAME(sc.NAME) + '.' + QUOTENAME(o.NAME)), c.NAME, 'IsIdentity') = 1 THEN 1
18831881
WHEN COLUMNPROPERTY(OBJECT_ID(QUOTENAME(sc.NAME) + '.' + QUOTENAME(o.NAME)), c.NAME, 'IsComputed') = 1 THEN 1
@@ -1959,8 +1957,8 @@ SELECT
19591957
c.is_rowguidcol = 1 OR
19601958
c.is_computed = 1 OR
19611959
[c].[generated_always_type] <> 0 OR
1962-
c.DATA_TYPE IN ( 'rowversion', 'timestamp' ) OR
1963-
( c.DATA_TYPE = 'uniqueidentifier' AND c.COLUMN_DEFAULT LIKE '%newsequentialid%' )
1960+
t.name IN ( ''rowversion'', ''timestamp'' ) OR
1961+
( t.name = ''uniqueidentifier'' AND sd.definition LIKE ''%newsequentialid%'' )
19641962
THEN 1
19651963
ELSE 0
19661964
END
@@ -1975,6 +1973,8 @@ FROM
19751973
INNER JOIN sys.columns c ON c.[object_id] = st.base_object_id
19761974

19771975
LEFT JOIN sys.types t ON c.user_type_id = t.user_type_id
1976+
1977+
LEFT OUTER JOIN sys.default_constraints sd ON c.default_object_id = sd.object_id
19781978

19791979
INNER JOIN sys.objects o ON c.[object_id] = o.[object_id]
19801980

@@ -2049,13 +2049,13 @@ WHERE
20492049
-- Loop through synonyms and populate #SynonymDetails
20502050
DECLARE @synonmymDatabaseName sysname = (SELECT TOP (1) DatabaseName FROM #SynonymTargets)
20512051
DECLARE @synonmymDetailsSelect nvarchar(max)
2052-
WHILE (@synonmymDatabaseName IS NOT NULL)
2052+
WHILE ( @synonmymDatabaseName IS NOT NULL)
20532053
BEGIN
2054-
SET @synonmymDetailsSelect = REPLACE(@synonymDetailsQueryTemplate, '[@synonmymDatabaseName]', '[' + @synonmymDatabaseName + ']')
2055-
--SELECT @synonmymDetailsSelect
2056-
EXEC sp_executesql @stmt=@synonmymDetailsSelect, @params=N'@synonmymDatabaseName sysname', @synonmymDatabaseName=@synonmymDatabaseName
2057-
DELETE FROM #SynonymTargets WHERE DatabaseName = @synonmymDatabaseName
2058-
SET @synonmymDatabaseName = (SELECT TOP (1) DatabaseName FROM #SynonymTargets)
2054+
SET @synonmymDetailsSelect = REPLACE(@synonymDetailsQueryTemplate, '[@synonmymDatabaseName]', '[' + @synonmymDatabaseName + ']')
2055+
--SELECT @synonmymDetailsSelect
2056+
EXEC sp_executesql @stmt=@synonmymDetailsSelect, @params=N'@synonmymDatabaseName sysname', @synonmymDatabaseName=@synonmymDatabaseName
2057+
DELETE FROM #SynonymTargets WHERE DatabaseName = @synonmymDatabaseName
2058+
SET @synonmymDatabaseName = (SELECT TOP (1) DatabaseName FROM #SynonymTargets)
20592059
END
20602060
SET NOCOUNT OFF;
20612061
";
@@ -2668,30 +2668,45 @@ SELECT SERVERPROPERTY('Edition') AS Edition,
26682668
return _sqlDatabaseEngineEdition == "Azure";
26692669
}
26702670

2671-
public override Tables ReadSchema()
2671+
private String GetReadSchemaSql()
26722672
{
2673-
var result = new Tables();
2674-
if(Cmd == null)
2675-
return result;
2676-
2677-
if(Settings.IncludeSynonyms)
2678-
Cmd.CommandText = SynonymTableSQLSetup + TableSQL + SynonymTableSQL + IncludeQueryTraceOn9481();
2679-
else
2680-
Cmd.CommandText = TableSQL + IncludeQueryTraceOn9481();
2681-
2682-
if (Settings.IsSqlCe)
2683-
Cmd.CommandText = TableSQLCE;
2673+
if( Settings.IsSqlCe )
2674+
{
2675+
return TableSQLCE;
2676+
}
2677+
2678+
String sql;
2679+
if( Settings.IncludeSynonyms )
2680+
{
2681+
sql = SynonymTableSQLSetup + TableSQL + SynonymTableSQL + IncludeQueryTraceOn9481();
2682+
}
26842683
else
2685-
Cmd.CommandTimeout = Settings.CommandTimeout;
2684+
{
2685+
sql = TableSQL + IncludeQueryTraceOn9481();
2686+
}
26862687

26872688
if (!Settings.TemporalTableSupport)
26882689
{
2689-
Cmd.CommandText = Cmd.CommandText
2690+
// Replace the column names (only present in SQL Server 2016 or later) with literal constants so the query works with older versions of SQL Server.
2691+
sql = sql
26902692
.Replace("[sc].[generated_always_type]", "0" )
26912693
.Replace("[c].[generated_always_type]", "0" )
26922694
.Replace("[st].[temporal_type]", "0" );
26932695
}
26942696

2697+
return sql;
2698+
}
2699+
2700+
public override Tables ReadSchema()
2701+
{
2702+
var result = new Tables();
2703+
if (Cmd == null)
2704+
return result;
2705+
2706+
Cmd.CommandText = this.GetReadSchemaSql();
2707+
2708+
if (!Settings.IsSqlCe) Cmd.CommandTimeout = Settings.CommandTimeout;
2709+
26952710
using(var rdr = Cmd.ExecuteReader())
26962711
{
26972712
var rxClean = new Regex("^(event|Equals|GetHashCode|GetType|ToString|repo|Save|IsNew|Insert|Update|Delete|Exists|SingleOrDefault|Single|First|FirstOrDefault|Fetch|Page|Query)$");
@@ -2713,12 +2728,15 @@ SELECT SERVERPROPERTY('Edition') AS Edition,
27132728
table = result.Find(x => x.Name == tableName && x.Schema == schema);
27142729
if(table == null)
27152730
{
2731+
String tableType = ((String)rdr["TableType"]).Trim();
2732+
TableTemporalType tableTemporalType = (TableTemporalType)(Byte)rdr["TableTemporalType"];
2733+
27162734
table = new Table
27172735
{
27182736
Name = tableName,
27192737
Schema = schema,
2720-
IsView = string.Compare(rdr["TableType"].ToString().Trim(), "View", StringComparison.OrdinalIgnoreCase) == 0,
2721-
TemporalType = (TableTemporalType)(Byte)rdr["TableTemporalType"],
2738+
IsView = string.Compare(tableType, "View", StringComparison.OrdinalIgnoreCase) == 0,
2739+
TemporalType = tableTemporalType,
27222740

27232741
// Will be set later
27242742
HasForeignKey = false,

0 commit comments

Comments
 (0)