Entity Framework Core 和 SQL Server 2016 时态表

Entity Framework Core and SQL Server 2016 temporal tables

我们正在为我们的 .NET Core Web API 使用 EF Core 和 SQL Server 2016。我正在评估临时表的使用及其对 EF Core 代码的影响。当我使用 cmdline 生成 EF 模型时,它会在 dbcontext 中生成带有 appstart、append 和映射的模型。当我执行 insert/update 时,他们没有说这些列无法更新。我必须从模型和 dbcontext 映射中删除 appstart、end 才能使其工作。我读到在 EF 6.x.

之类的 EF Core 中还没有拦截功能

请告知任何更好的解决方案。

目前没有更好的解决方案,功能在backlog上。

我尝试了以下选项,它们都有效。

  1. 选项 1:删除了 appstart,从实体和附加字段 dbcontext 映射和 updates/insert 开始正常工作。

  2. 选项 2:用 属性如下。


[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime StartTime { get; set; }

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime EndTime { get; set; } 

隐藏期间开始列 (StartTime) 和期间结束列 (EndTime) 应该可以解决此问题。我们可以通过

ALTER TABLE [dbo].[Table1] ALTER COLUMN [StartTime] ADD HIDDEN;
ALTER TABLE [dbo].[Table1] ALTER COLUMN [EndTime] ADD HIDDEN;

我们可以在 sys.columns table

中看到这些列的隐藏设置
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 开箱即用的服务器临时表。

查看此答案以获取示例: