[英]Net Core: Entity Framework and SQL Server Temporal Tables, Automatic Scaffolding
[英]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
从 6.0 RC1 Entity Framework Core 版本开始,Entity Framework Core 现在支持临时表。
您可以在此处阅读有关该功能的更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.