我想创建一个 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
之外,还有其他我应该引用的库吗?
最佳答案
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
不是没用,它告诉 Entity Framework 该列在数据库中是必需的,但是由数据库计算的。所以它知道它应该在迁移中创建该列并且它知道它不应该尝试更新它的值或插入一个值。
缺少的是您必须将计算添加到数据库列。你通过修改迁移来做到这一点:
AddColumn("dbo.Specialty",
"CreatedDate",
c => c.DateTime(defaultValueSql: "GETDATE()"));
目前没有办法在数据注释中指定 sql,我怀疑永远不会有,因为 sql 可能是特定于数据库的,因此最好保留在迁移中而不是允许泄漏到模型中定义
关于c# - Entity Framework 默认日期时间注释不迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23413625/