【问题标题】:Entity Framework Default DateTime Annotation Does Not Migrate实体框架默认 DateTime 注解不迁移
【发布时间】:2014-05-01 18:02:36
【问题描述】:

我想创建一个 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(...) 的 nullable 默认情况下是 true,所以我理解为什么没有指定它。但是defaultValueSql: "GETDATE()"在哪里?

我知道我可以手动输入,但这似乎违背了Add-Migration 的目的,并使[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 无用。我知道 defaultValueSql 的默认值不是“GETDATE()”,因为当我在 SQL Management Studio 中查看列属性时它没有显示出来。

缺少什么?那么,名称“CreatedDate”是否违反了 EF 约定?除了System.ComponentModel.DataAnnotations.Schema,还有其他我应该参考的库吗?

【问题讨论】:

标签: c# entity-framework datetime


【解决方案1】:

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

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

        AddColumn("dbo.Specialty", 
                  "CreatedDate", 
                  c => c.DateTime(defaultValueSql: "GETDATE()"));

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

【讨论】:

  • 所以我们必须进入 Configuration.cs 并将其放入。我想我必须手动完成。只是教程没有告诉我们这一点。他们声明 defaultValueSql: "GETDATE()" 将由 Add-Migration 自动写入。
  • 请注意 -> GETUTCDATE() 最终优于 GETDATE()。
  • @Tymski 是的。除非您“想要创建一个 DateTime 字段,以便它在进入数据库后将具有默认的 GETDATE()。”
  • @Colin,是的,是的,但我的意思是,即使你认为你想要 GETDATE(),你也确实想要 GETUTCDATE()。
【解决方案2】:

我最终从一个基类继承了所有实体,遵循these instructions

这意味着为 CreatedDate 和 UpdatedDate 列创建一个自定义迁移类,并且只需最少的工作即可完美运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 2012-09-09
    • 2015-05-11
    • 1970-01-01
    • 2017-08-09
    相关资源
    最近更新 更多