如何将时态表添加到 EF Code-First DBContext?

Posted

技术标签:

【中文标题】如何将时态表添加到 EF Code-First DBContext?【英文标题】:How to add temporal tables to EF Code-First DBContext? 【发布时间】:2019-10-23 16:00:56 【问题描述】:

我想在 DBContext 中的项目中添加 SQL 时态表,而不是在迁移文件中?如何实现? 编辑: 我已将它添加到种子功能,但它仍然无法正常工作

 protected override void Seed(MSDBContext context)
    
        string sql = @"  ALTER TABLE dbo.Workshops

 ADD SysStartTime datetime2 GENERATED ALWAYS AS ROW START  
  CONSTRAINT DF_Workshops_SysStartTime DEFAULT SYSUTCDATETIME() NOT NULL,
  SysEndTime datetime2 GENERATED ALWAYS AS ROW END 
  CONSTRAINT DF_Workshops_SysEndTime DEFAULT CONVERT (DATETIME2, '9999-12-31 23:59:59') NOT NULL,
         PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime)
  GO

  ALTER TABLE dbo.Workshops
      SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.WorkshopsHistory))
  GO";
        context.Database.ExecuteSqlCommand(sql);

        context.SaveChanges();

        context.Configuration.LazyLoadingEnabled = false;
    

【问题讨论】:

EF 不是用来创建临时表的。 “临时”的意思是“在一个事务内——所以在一个查询中,你创建一个表,转换它,获取一些输出并删除它。所有这些都在同一个步骤中。EF 不支持这种复杂的查询。你只是想在运行时创建一个表?那会有所不同。 @holger - docs.microsoft.com/en-us/sql/relational-databases/tables/… @Holger 临时表不是临时表。 我不知道临时表 - 所以感谢您的提示。我怀疑 EF Core 是否支持它 【参考方案1】:

如果您只想创建表,可以运行即席 sql 查询。

using (var ctx = new DBDataContext())

    var rowsEffected = ctx.Database.ExecuteSqlCommand("YOUR SQL TO ADD TABLES");

如果这不起作用,您不必使用 EF,您可以使用良好的旧 ADO.NET sql 客户端类来运行查询。

【讨论】:

这不是答案,因为 OP 已经告诉过使用 ExecuteSqlCommand() 不起作用 @DanielSchmid,可能是在 OP 在尝试后编辑他们的问题之前?

以上是关于如何将时态表添加到 EF Code-First DBContext?的主要内容,如果未能解决你的问题,请参考以下文章

在 EF6 中使用时态表 - PostgreSQL

EF Code-First如何使用复合键从表中读取A.

如何使用 EF Code-First 插入/更新可更新视图

将相关数据添加到 Entity Framework 5 (Code-First) 中的交叉引用表

EF Code-First 学习之旅

EF Code-First 学习之旅 DataAnnotations