Entity Framework 6 不适用于时态表

Posted

技术标签:

【中文标题】Entity Framework 6 不适用于时态表【英文标题】:Entity Framework 6 doesn't work with Temporal table 【发布时间】:2017-12-09 06:11:00 【问题描述】:

我已更改现有表以使其成为临时表,然后我从数据库中更新了模型。我在表中添加了两个新列时遇到了这些错误:

错误 3004:从第 1388 行开始映射片段时出现问题:否 为属性 TbCities.SysStartTime 指定的映射, 设置 TbCities 中的 TbCities.SysEndTime。具有密钥 (PK) 的实体不会 往返时:实体类型为 [DiERPModel.TbCities] 1389 15 DiERP

这是我更改表的查询:

  --Step 1. Adding nullable the columns
  ALTER TABLE Common.TbCities ADD SysStartTime datetime2 NULL  
  GO
  ALTER TABLE Common.TbCities ADD SysEndTime datetime2 NULL  
  GO
  --Step 2 Adding the default constraints
  ALTER TABLE Common.TbCities ADD CONSTRAINT DF_Cities_SysStartTime DEFAULT GETDATE() FOR SysStartTime;
  GO
  ALTER TABLE Common.TbCities ADD CONSTRAINT DF_Cities_SysEndTime DEFAULT CAST('9999-12-31 23:59:59.9999999' AS DATETIME2) FOR SysEndTime;
  --Step 3 Updating the column
  UPDATE Common.TbCities 
    SET SysStartTime = '19000101 00:00:00.0000000'
        ,SysEndTime = '99991231 23:59:59.9999999'
  GO
  --Step 4 Setting NOT NULL to the columns
  ALTER TABLE Common.TbCities ALTER COLUMN SysStartTime datetime2 NOT NULL  
  GO
  ALTER TABLE Common.TbCities ALTER COLUMN SysEndTime datetime2 NOT NULL  
  GO
  --Step 5 Adding PERIOD FOR SYSTEM_TIME option
  ALTER TABLE Common.TbCities ADD PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime)
  GO
  --Step 6 Setting SYSTEM_VERSIONING property
  ALTER TABLE Common.TbCities
      SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = Common.TbCities_History))
  GO 

【问题讨论】:

【参考方案1】:

我建议你添加:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]

TbCities 的实体模型类中的SysStartTimeSysEndTime, 以便实体框架知道它们的值将由 SQL 服务器生成,而不是将它们设置为自己的默认值。

【讨论】:

以上是关于Entity Framework 6 不适用于时态表的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework Core 6.0 中的新功能介绍

Entity Framework Core 6.0 中的新功能介绍

Entity Framework Core 6.0 中的新功能介绍

Entity Framework Core 6.0 中的新功能介绍

在 Entity Framework Core 2.0 中执行存储过程

在 ASP.NET Core 中使用 Entity Framework 6