繁体   English   中英

Entity Framework Core 和 SQL Server 2016 时态表

[英]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. 选项 1:删除 appstart,从实体和 dbcontext 映射和更新/插入中附加字段开始正常工作。

  2. 选项 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 时态表。

有关示例,请参阅此答案:

https://stackoverflow.com/a/70017768/3850405

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM