C# · 12月 24, 2021

c# – 实体框架默认日期时间注释不迁移

我想创建一个DateTime字段,以便它一旦到达数据库就会有一个默认的GETDATE().所以我这样做了: public class Specialty { [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime? CreatedDate { get; set; } // other properties not shown for brevity. }

所以我在PM>中运行了Add-Migration.安慰.在Up函数中导致了这一点(并未显示所有行):

AddColumn(“dbo.Specialty”,”CreatedDate”,c => c.DateTime());

我明白c.DateTime(…)的可空是默认为真,所以我明白为什么没有指定.但是defaultValuesql在哪里:“GETDATE()”?

我知道我可以手动把它,但这似乎打败了Add-Migration的目的,并使[DatabaseGenerated(DatabaseGeneratedOption.Computed)]无用.我知道defaultValuesql的默认值不是“GETDATE()”,因为当我查看sql Management Studio中的列属性时它不会显示.

少了什么东西?名称“CreatedDate”是否违反了EF惯例?除了System.ComponentModel.DataAnnotations.Schema之外,我还应该引用另一个库吗?

解决方法 [DatabaseGenerated(DatabaseGeneratedOption.Computed)]并非无用,它告诉实体框架该列在数据库中是必需的,但是由数据库计算.所以它知道它应该在迁移中创建列,它知道它不应该尝试更新其值,也不应该插入值.

缺少的是您必须将计算添加到数据库列.你通过修改迁移来做到这一点:

AddColumn(“dbo.Specialty”,c => c.DateTime(defaultValuesql: “GETDATE()”));

目前没有办法在数据注释中指定sql,我怀疑永远不会有,因为sql可能是特定于数据库的,因此最好保留在迁移中,而不是允许泄漏到模型定义中