如何使用 SQL 服务器 - 具有 EntityFramework 核心的时态表

How to use SQL Server - Temporal tables with EntityFramework Core

所以,首先我在 SQL 服务器中创建了一个临时(系统版本)table。 为简单起见:

CREATE TABLE dbo.person
(
    ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED,
    NAME VARCHAR(10) NOT NULL,
    SysStartTime DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL,
    SysEndTime DATETIME2 GENERATED ALWAYS AS ROW END NOT NULL,
    PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.person_history));

GO

然后我使用Scaffold-DbContext命令来创建对象。 所以它创建了 1 个对象:


public partial class person
{
    public int ID { get; set; }
    public string NAME { get; set; }
    public DateTime SysStartTime { get; set; }
    public DateTime SysEndTime { get; set; }
}

现在我想将一个新项目保存到这个 table,这就是问题所在。


using (var context = new myDBContext())
{
    var newItem = new person
    {
        NAME = "Sergey"
    };

    context.person.Add(newItem);

    context.SaveChanges();
}

这是 SaveChanges() 行的异常:

SqlException: Cannot insert an explicit value into a GENERATED ALWAYS column in table 'dbo.person'. Use INSERT with a column list to exclude the GENERATED ALWAYS column, or insert a DEFAULT into GENERATED ALWAYS column

所以我的问题是,我错过了什么? 我是否应该添加任何设置来指定此 table 是系统版本?

当我使用脚本将数据直接插入到 table 时,效果很好。

手动更新上下文文件中的OnModelCreating函数,将这两行添加到person实体:

entity.Property(e => e.SysStartTime).ValueGeneratedOnAddOrUpdate();
entity.Property(e => e.SysEndTime).ValueGeneratedOnAddOrUpdate();

现在,当您添加或更新实体时,这些值将始终由 SQL 生成。

并且您可以将数据插入和更新到 person table

如果您想访问历史记录 table,您将需要另一个扩展,如下所述:

并取自此来源: https://github.com/glautrou/EfCoreTemporalTable

从版本 6.0 RC1 Entity Framework Core 开始,Entity Framework Core 现在支持临时表。

您可以阅读有关功能的更多信息 here