实体框架默认日期时间注释不会迁移

Mic*_*uso 6 c# datetime entity-framework

我想创建一个DateTime字段,以便它GETDATE()一旦到达数据库就会有一个默认值.所以我这样做了:

 public class Specialty
 {
     [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
     public DateTime? CreatedDate { get; set; }

     // other properties not shown for brevity.
 }
Run Code Online (Sandbox Code Playgroud)

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

AddColumn("dbo.Specialty", "CreatedDate", c => c.DateTime());
Run Code Online (Sandbox Code Playgroud)

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

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

少了什么东西?名称"CreatedDate"是否违反了EF惯例?还有其他我应该参考的图书馆System.ComponentModel.DataAnnotations.Schema吗?

Col*_*lin 9

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

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

        AddColumn("dbo.Specialty", 
                  "CreatedDate", 
                  c => c.DateTime(defaultValueSql: "GETDATE()"));
Run Code Online (Sandbox Code Playgroud)

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