【问题标题】:Entity Framework Core and SQL Server 2016 temporal tablesEntity Framework Core 和 SQL Server 2016 时态表
【发布时间】:2017-03-06 14:02:40
【问题描述】:
我们将 EF Core 和 SQL Server 2016 用于我们的 .NET Core Web API。我正在评估临时表的使用及其对 EF Core 代码的影响。当我使用 cmdline 生成 EF 模型时,它会在dbcontext 中生成带有 appstart、append 和映射的模型。当我插入/更新时,他们说这些列无法更新。我必须从模型中删除 appstart、end 和 dbcontext 映射才能使其正常工作。我读到 EF Core 中还没有像 EF 6.x 这样的拦截功能。
请告知任何更好的解决方案。
【问题讨论】:
标签:
c#
asp.net-core
.net-core
entity-framework-core
temporal-tables
【解决方案1】:
我尝试了以下选项,它们正在工作。
选项 1:删除 appstart,从实体中追加字段和
dbcontext 映射和更新/插入开始正常工作。
选项 2:用
属性如下。
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime StartTime { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime EndTime { get; set; }
【解决方案3】:
隐藏期间开始列 (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
【解决方案4】:
我认为有一个更好的解决方案如下:
创建部分上下文文件(以防止重新生成模型后重新进行更改)如下
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();
});
}
}