【问题标题】:How to use the default Entity Framework and default date values如何使用默认实体框架和默认日期值
【发布时间】:2023-03-12 01:00:01
【问题描述】:

在我的 SQL Server 数据库架构中,我有一个数据表,其中的日期字段包含默认值

CONVERT(VARCHAR(10), GETDATE(), 111)

这是在手动将记录输入数据库时​​自动将日期插入新记录的理想选择。

我遇到的问题是,当使用实体框架并映射日期字段时,实体框架会在实例化实体时插入默认值 DateTime.Min。

我无法将 Date 字段映射到可为空的 DateTime,即 DateTime?,我也无法在实体设计器的默认值中使用 CONVERT 或 DateTime.Now.Today,因为它只接受硬编码的常量值。

我当然可以在创建对象时在 C# 中显式设置 DateTime 字段,无论是在代码中、在部分类的构造函数中,还是在保存更改事件期间。

在实际使用存储在数据库表中的默认值计算的情况下,还有其他方法可以实现我想要的吗?

【问题讨论】:

  • 您可以尝试将字段设置为自动生成。我从未尝试过,也不确定它的效果如何。
  • 我在 EDM Designer 中环顾四周,没有看到任何我可以描述为提供的选项、菜单项或属性。在设计器中哪里可以找到“将字段设置为自动生成”?我假设您指的是设计器,而不是 SQL Server 中的东西。或者您可能指的是“计算列规范”?
  • 克雷格,感谢您提供的链接。一个几乎完美的解决方案。它可以工作,但在使用设计器工具更新 EDMX 时会被覆盖,如链接文章中所指出的那样。

标签: c# entity-framework


【解决方案1】:

为您的 EntityObject 创建一个分部类,添加一个默认构造函数,并在其中设置默认值。

    public partial class YourDBObject
    {
          public YourDBObject()
          {
               this._DateField = DateTime.Now;
          }
    }

【讨论】:

  • 正是我需要的(虽然不是这个问题)! :D
  • 谢谢。这行得通,尽管起初它让我感到困惑,因为当从数据库中获取现有对象时也会调用构造函数 - 但是在这些情况下,DateTime.Now 在构造后会被数据库值覆盖。
【解决方案2】:

您可以使用database trigger,它在插入时会检查插入的值是否为 DateTime.MinValue (01.01.0001) 并将其替换为您想要的计算值。这个MSDN article 描述了如何创建触发器。

一个小“缺陷”:使用此解决方案,您必须将新对象存储到数据库中,然后再将其读回以使用计算值更新您的对象。

【讨论】:

  • 好点。那也行。但感觉就像我在挥舞着大锤敲碎核桃。
【解决方案3】:

这真的很不幸。引用StoreGeneratedPattern 的答案不是真正的解决方案,它不允许您设置值。

团队所要做的就是这样:

    [Required]
    [DefaultValue] // suggested attribute, whatever you want to call it
    public DateTime Created { get; set; }

如果一个字段被标记为 DefaultValue,那么在 EF 的 SQL 生成时,如果field == default(DateTime),则检查具有此属性的属性,如果是,则只需从生成的代码中省略该列。

【讨论】:

    【解决方案4】:

    我刚刚遇到这个问题 - 我通过使用部分方法在实体的构造函数中设置日期(我需要自动生成的字段)来解决它。这是否是理想的,或者它是否适用于所有情况还有待观察,但到目前为止它已经解决了我的问题。

    【讨论】:

    • 这是我最终选择的解决方案。这似乎有点杂乱无章,但它完美无缺。遗憾的是,EF 中存在这样的疏忽。
    • 很高兴能帮上忙,希望 EF4 能解决这个问题。如果您认为这是您可能找到的最佳解决方案,请将其标记为答案(或至少对其进行投票),以便我获得一些荣誉 - 我正在尝试建立至少足够的代表以更积极地使用该网站.谢谢!
    • 我会这样做,但这需要 15 声望。对不起。
    • 如果您这样做,存储的日期将不是 EF 上下文代码运行的日期(可能是客户端),而是数据库服务器。这意味着用户可以通过更改 PC 上的时间来“伪造”日期。
    • 在构造函数中设置日期将破坏使用 WCF 上的规范数据模型的 n 层应用程序
    【解决方案5】:

    我在使用带有实体框架的 RIA 服务时遇到了类似的问题。我无法在客户端的默认构造函数中设置值,因为那里生成的实体类已经有一个空的默认构造函数。

    我使用的解决方案是通过设置所需的默认值,在客户端为实体实现 OnCreated 部分方法。

    【讨论】:

      【解决方案6】:

      我认为lazyberezovsky 在另一个 SO 问题上提供的答案是解决这个问题的直接方法Entity Framework and Default Date

      【讨论】:

        【解决方案7】:

        刚好遇到这个问题。实体框架本身不支持默认值。您需要在 Edmx 文件实体中的列上设置属性 StoreGeneratedPattern = Computed。然后,您在数据库中设置的默认值将优先于 EF 默认设置的值,即 DateTime.Min

        【讨论】:

          【解决方案8】:

          日期字段可以映射到DateTime吗?仅当该列在数据库中可为空时。

          【讨论】:

          • 但是如果该列可以为空,那么逻辑表明您不能有“默认值”。这就是 SQL 服务器所展示的行为。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-01-14
          • 1970-01-01
          • 1970-01-01
          • 2012-07-04
          • 1970-01-01
          • 2012-06-21
          • 1970-01-01
          相关资源
          最近更新 更多