【问题标题】:What does HasDefaultValueSQL do in a database first implementation?HasDefaultValueSQL 在数据库优先实现中做了什么?
【发布时间】:2021-03-02 20:07:17
【问题描述】:

我们使用的是 Entity Framework 3.1,并且对 .HasDefaultValueSQL 有一些引用。

entity.Property(e => e.UpdateTimeStamp)
    .HasColumnType("datetime")
    .HasDefaultValueSql("GetDate()");

出于某种原因,我们必须更改 GetDate(),而这只是我们代码中的一处,而实体框架中没有本地知识。

我的问题是,HasDefaultValueSQL 中的值在数据库优先实现中有何作用?

我们已经更改并测试了多个其他字符串的值,到目前为止,我们觉得它没有被使用,但找不到任何类型的文档或指南来显示它的作用,以及在我们的案例中改变它会做什么。

【问题讨论】:

  • 无,它用于代码优先,实体定义将定义架构。如果 EF 打算在 DB-First 中运行,请确保关闭迁移/模式初始化,否则在手动更改模式后运行应用程序时可能会出现验证异常。
  • @StevePy 那是我们目前的工作理论,我们只是没有证据证明,这使得将其呈现给权力不太理想的选择。

标签: c# .net entity-framework


【解决方案1】:

EF 在数据库优先方案中不使用您传递给HasDefaultValueSql 的值,但是在模型上配置属性时调用该方法的事实确实会产生影响。

当您执行插入时,这意味着如果属性具有 CLR 默认值(null,或 0 表示 int、空 GUID 等),它将从插入语句中省略该列;它将避免将列显式设置为该空(等)值,因为据了解,数据库具有某种默认值(可能是提供的默认值,但它不检查这一点,只是假设配置了某些东西在数据库上)。

所以,如果你在数据库中有一个默认值,你应该在你的模型中设置它以使用它。

我发现对默认 SQL 进行准确建模的另一个重要原因是,即使首先使用数据库,您的单元测试也可能使用代码优先方法(即使用您的模型构建数据库进行测试)。因此,让单元测试数据库准确无误是个好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多