![](/img/trans.png)
[英]Net Core: Entity Framework and SQL Server Temporal Tables, Automatic Scaffolding
[英]Entity Framework Core and SQL Server 2016 temporal tables
我们将 EF Core 和 SQL Server 2016 用于我们的 .NET Core Web API。 我正在评估时态表的使用及其对 EF Core 代码的影响。 当我使用 cmdline 生成 EF 模型时,它会生成带有 appstart、append 和dbcontext
映射的dbcontext
。 当我插入/更新时,他们说这些列无法更新。 我不得不从模型和dbcontext
映射中删除 appstart、end 以使其工作。 我读到像 EF 6.x 这样的 EF Core 中还没有拦截功能。
请就此提出任何更好的解决方案。
我尝试了以下选项,它们正在工作。
选项 1:删除 appstart,从实体和 dbcontext 映射和更新/插入中附加字段开始正常工作。
选项 2:使用如下属性装饰周期列。
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime StartTime { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime EndTime { get; set; }
目前没有更好的解决方案,该功能在backlog 中。
隐藏期间开始列(StartTime)和期间结束列(EndTime)应该可以解决此问题。 我们可以通过
ALTER TABLE [dbo].[Table1] ALTER COLUMN [StartTime] ADD HIDDEN;
ALTER TABLE [dbo].[Table1] ALTER COLUMN [EndTime] ADD HIDDEN;
我们可以在 sys.columns 表中看到针对这些列的隐藏设置
SELECT * FROM sys.columns WHERE is_hidden = 1
我认为有一个更好的解决方案如下:创建部分上下文文件(以防止在重新生成模型后重新进行更改)如下
public partial class DatabaseDBContext : DbContext
{
partial void OnModelCreatingPartial(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Table1>(entity =>
{
entity.Property(e => e.StartTime)
.ValueGeneratedOnAddOrUpdate();
entity.Property(e => e.EndTime)
.ValueGeneratedOnAddOrUpdate();
});
}
}
.NET 6 和 Entity Framework Core 6.0 支持开箱即用的 SQL Server 时态表。
有关示例,请参阅此答案:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.