C# 带有时态表的实体框架核心3.1-访问SysStartTime和SysEndTime
我已经基于Microsoft SQL文档创建了时态表,创建了一个带有默认历史记录表的时态表 迁移:C# 带有时态表的实体框架核心3.1-访问SysStartTime和SysEndTime,c#,.net,.net-core,entity-framework-core,temporal-tables,C#,.net,.net Core,Entity Framework Core,Temporal Tables,我已经基于Microsoft SQL文档创建了时态表,创建了一个带有默认历史记录表的时态表 迁移: public partial class Temporaltables : Migration { List<string> tablesToUpdate = new List<string> { "Images", "Languages",
public partial class Temporaltables : Migration
{
List<string> tablesToUpdate = new List<string>
{
"Images",
"Languages",
"Questions",
"Texts",
"Medias",
};
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql($"CREATE SCHEMA History");
foreach (var table in tablesToUpdate)
{
string alterStatement = $@"ALTER TABLE [{table}] ADD SysStartTime datetime2(0) GENERATED ALWAYS AS ROW START HIDDEN
CONSTRAINT DF_{table}_SysStart DEFAULT GETDATE(), SysEndTime datetime2(0) GENERATED ALWAYS AS ROW END HIDDEN
CONSTRAINT DF_{table}_SysEnd DEFAULT CONVERT(datetime2 (0), '9999-12-31 23:59:59'),
PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime)";
migrationBuilder.Sql(alterStatement);
alterStatement = $@"ALTER TABLE [{table}] SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = History.[{table}]));";
migrationBuilder.Sql(alterStatement);
}
}
protected override void Down(MigrationBuilder migrationBuilder)
{
foreach (var table in tablesToUpdate)
{
string alterStatement = $@"ALTER TABLE [{table}] SET (SYSTEM_VERSIONING = OFF);";
migrationBuilder.Sql(alterStatement);
alterStatement = $@"ALTER TABLE [{table}] DROP PERIOD FOR SYSTEM_TIME";
migrationBuilder.Sql(alterStatement);
alterStatement = $@"ALTER TABLE [{table}] DROP DF_{table}_SysStart, DF_{table}_SysEnd";
migrationBuilder.Sql(alterStatement);
alterStatement = $@"ALTER TABLE [{table}] DROP COLUMN SysStartTime, COLUMN SysEndTime";
migrationBuilder.Sql(alterStatement);
alterStatement = $@"DROP TABLE History.[{table}]";
migrationBuilder.Sql(alterStatement);
}
migrationBuilder.Sql($"DROP SCHEMA History");
}
}
ApplicationDbContext.cs:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{...
foreach (var et in modelBuilder.Model.GetEntityTypes())
{
foreach (var prop in et.GetProperties())
{
if (prop.Name == "SysStartTime" || prop.Name == "SysEndTime")
{
prop.ValueGenerated = Microsoft.EntityFrameworkCore.Metadata.ValueGenerated.OnAddOrUpdate;
}
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{...
foreach (var et in modelBuilder.Model.GetEntityTypes())
{
foreach (var prop in et.GetProperties())
{
if (prop.Name == "SysStartTime" || prop.Name == "SysEndTime")
{
prop.ValueGenerated = Microsoft.EntityFrameworkCore.Metadata.ValueGenerated.OnAddOrUpdate;
}
}
}
及
对于已经有列的表,我只是删除了迁移的
Up
和Down
值,然后它就工作了:
migrationBuilder.AddColumn<DateTime>(
name: "SysStartTime",
table: "Questions",
type: "datetime2(0)",
nullable: false,
defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
ApplicationDbContext.cs:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{...
foreach (var et in modelBuilder.Model.GetEntityTypes())
{
foreach (var prop in et.GetProperties())
{
if (prop.Name == "SysStartTime" || prop.Name == "SysEndTime")
{
prop.ValueGenerated = Microsoft.EntityFrameworkCore.Metadata.ValueGenerated.OnAddOrUpdate;
}
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{...
foreach (var et in modelBuilder.Model.GetEntityTypes())
{
foreach (var prop in et.GetProperties())
{
if (prop.Name == "SysStartTime" || prop.Name == "SysEndTime")
{
prop.ValueGenerated = Microsoft.EntityFrameworkCore.Metadata.ValueGenerated.OnAddOrUpdate;
}
}
}
迁移,如果您已经有架构历史记录
,则删除这些行:
public partial class Temporaltables : Migration
{
List<string> tablesToUpdate = new List<string>
{
"NewTable1",
"NewTable2",
};
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql($"CREATE SCHEMA History");
foreach (var table in tablesToUpdate)
{
string alterStatement = $@"ALTER TABLE [{table}]
ADD PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime])";
migrationBuilder.Sql(alterStatement);
alterStatement = $@"ALTER TABLE [{table}]
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = History.[{table}], DATA_CONSISTENCY_CHECK = ON));";
migrationBuilder.Sql(alterStatement);
}
}
protected override void Down(MigrationBuilder migrationBuilder)
{
foreach (var table in tablesToUpdate)
{
string alterStatement = $@"ALTER TABLE [{table}] SET (SYSTEM_VERSIONING = OFF);";
migrationBuilder.Sql(alterStatement);
alterStatement = $@"ALTER TABLE [{table}] DROP PERIOD FOR SYSTEM_TIME";
migrationBuilder.Sql(alterStatement);
alterStatement = $@"DROP TABLE History.[{table}]";
migrationBuilder.Sql(alterStatement);
}
migrationBuilder.Sql($"DROP SCHEMA History");
}
}
公共部分类临时表:迁移
{
列表表更新=新列表
{
“新表格1”,
“新表格2”,
};
受保护的覆盖作废(MigrationBuilder MigrationBuilder)
{
Sql($“创建架构历史”);
foreach(表更新中的var表)
{
字符串alterStatement=$@“ALTER TABLE[{TABLE}]
为系统时间([SysStartTime]、[SysEndTime])添加时段;
Sql(alterStatement);
alterStatement=$@“ALTER TABLE[{TABLE}]
设置(SYSTEM_VERSIONING=ON(HISTORY_TABLE=HISTORY。[{TABLE}],DATA_CONSISTENCY_CHECK=ON));“;
Sql(alterStatement);
}
}
受保护的覆盖无效关闭(MigrationBuilder MigrationBuilder)
{
foreach(表更新中的var表)
{
字符串alterStatement=$@“ALTERTABLE[{TABLE}]集合(SYSTEM_VERSIONING=OFF);”;
Sql(alterStatement);
alterStatement=$@“ALTER TABLE[{TABLE}]系统时间的删除周期”;
Sql(alterStatement);
alterStatement=$@“删除表历史记录。[{TABLE}]”;
Sql(alterStatement);
}
Sql($“删除模式历史”);
}
}
关于GitHub的讨论:
对于已经有列的表,我只是简单地删除了迁移的
Up
和Down
值,然后它就工作了:
migrationBuilder.AddColumn<DateTime>(
name: "SysStartTime",
table: "Questions",
type: "datetime2(0)",
nullable: false,
defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
ApplicationDbContext.cs:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{...
foreach (var et in modelBuilder.Model.GetEntityTypes())
{
foreach (var prop in et.GetProperties())
{
if (prop.Name == "SysStartTime" || prop.Name == "SysEndTime")
{
prop.ValueGenerated = Microsoft.EntityFrameworkCore.Metadata.ValueGenerated.OnAddOrUpdate;
}
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{...
foreach (var et in modelBuilder.Model.GetEntityTypes())
{
foreach (var prop in et.GetProperties())
{
if (prop.Name == "SysStartTime" || prop.Name == "SysEndTime")
{
prop.ValueGenerated = Microsoft.EntityFrameworkCore.Metadata.ValueGenerated.OnAddOrUpdate;
}
}
}
迁移,如果您已经有架构历史记录
,则删除这些行:
public partial class Temporaltables : Migration
{
List<string> tablesToUpdate = new List<string>
{
"NewTable1",
"NewTable2",
};
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql($"CREATE SCHEMA History");
foreach (var table in tablesToUpdate)
{
string alterStatement = $@"ALTER TABLE [{table}]
ADD PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime])";
migrationBuilder.Sql(alterStatement);
alterStatement = $@"ALTER TABLE [{table}]
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = History.[{table}], DATA_CONSISTENCY_CHECK = ON));";
migrationBuilder.Sql(alterStatement);
}
}
protected override void Down(MigrationBuilder migrationBuilder)
{
foreach (var table in tablesToUpdate)
{
string alterStatement = $@"ALTER TABLE [{table}] SET (SYSTEM_VERSIONING = OFF);";
migrationBuilder.Sql(alterStatement);
alterStatement = $@"ALTER TABLE [{table}] DROP PERIOD FOR SYSTEM_TIME";
migrationBuilder.Sql(alterStatement);
alterStatement = $@"DROP TABLE History.[{table}]";
migrationBuilder.Sql(alterStatement);
}
migrationBuilder.Sql($"DROP SCHEMA History");
}
}
公共部分类临时表:迁移
{
列表表更新=新列表
{
“新表格1”,
“新表格2”,
};
受保护的覆盖作废(MigrationBuilder MigrationBuilder)
{
Sql($“创建架构历史”);
foreach(表更新中的var表)
{
字符串alterStatement=$@“ALTER TABLE[{TABLE}]
为系统时间([SysStartTime]、[SysEndTime])添加时段;
Sql(alterStatement);
alterStatement=$@“ALTER TABLE[{TABLE}]
设置(SYSTEM_VERSIONING=ON(HISTORY_TABLE=HISTORY。[{TABLE}],DATA_CONSISTENCY_CHECK=ON));“;
Sql(alterStatement);
}
}
受保护的覆盖无效关闭(MigrationBuilder MigrationBuilder)
{
foreach(表更新中的var表)
{
字符串alterStatement=$@“ALTERTABLE[{TABLE}]集合(SYSTEM_VERSIONING=OFF);”;
Sql(alterStatement);
alterStatement=$@“ALTER TABLE[{TABLE}]系统时间的删除周期”;
Sql(alterStatement);
alterStatement=$@“删除表历史记录。[{TABLE}]”;
Sql(alterStatement);
}
Sql($“删除模式历史”);
}
}
关于GitHub的讨论: