c# - Entity Framework 默认日期时间注释不迁移

标签 c# entity-framework datetime

我想创建一个 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/

相关文章:

c# - EF 的 ObjectContext.ApplyCurrentValues 等效项是什么

c# - 如果我们有一个包含项目列表的位掩码,如何存储项目的顺序?

entity-framework - 如何将子实体映射到父实体而不在子实体中引入原始类型父链接器?

c# - 在接口(interface)方法中使用父类的子类时接口(interface)的实现

c# - 使用 Entity Framework 创建数据库索引

python - 将 24 小时值转换为 HHMMSS - 时间

php - 将日期结构从 datetime 更改为 VARCHAR 时出现 mysql 错误 1064

识别 R 中的日期时间格式

c# - C# 中的正则表达式查找类似 "x-[some_string]"的匹配项

c# - 如何以编程方式更改 LINQ C# Winforms 中的连接字符串