繁体   English   中英

如何使用 SQL Server - 带有 EntityFramework Core 的临时表

[英]How to use SQL Server - Temporal tables with EntityFramework Core

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

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; }
}

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


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

    context.person.Add(newItem);

    context.SaveChanges();
}

这是 SaveChanges() 行中的异常:

SqlException: 无法将显式值插入到表 'dbo.person' 中的 GENERATED ALWAYS 列中。 将 INSERT 与列列表一起使用以排除 GENERATED ALWAYS 列,或将 DEFAULT 插入 GENERATED ALWAYS 列

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

当我使用脚本将数据直接插入到表中时,它运行良好。

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

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

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

你可以在person表中插入和更新数据

如果你想访问历史表,你需要另一个扩展,这里描述: https : //stackoverflow.com/a/69305781/3281522

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

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

您可以在此处阅读有关该功能的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM