【问题标题】:How to use SQL Server - Temporal tables with EntityFramework Core如何使用 SQL Server - 带有 EntityFramework Core 的时态表
【发布时间】:2021-11-12 16:13:13
【问题描述】:

所以,首先我在 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:无法将显式值插入到 GENERATED ALWAYS 表“dbo.person”中的列。将 INSERT 与 列列表以排除 GENERATED ALWAYS 列,或插入 DEFAULT 到 GENERATED ALWAYS 列

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

当我使用脚本将数据直接插入表格时,它可以完美运行。

【问题讨论】:

    标签: c# sql-server entity-framework-core .net-5 temporal-tables


    【解决方案1】:

    手动更新上下文文件中的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/glautrou/EfCoreTemporalTable

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 2019-09-27
        • 1970-01-01
        • 1970-01-01
        • 2011-09-16
        • 2020-06-26
        相关资源
        最近更新 更多