如何使用默认的实体框架和默认日期值

Jus*_*tin 13 c# entity-framework

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

CONVERT(VARCHAR(10), GETDATE(), 111)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

有没有其他方法可以实现我想要的,而实际使用的是存储在数据库表中的默认值计算?

小智 13

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

    public partial class YourDBObject
    {
          public YourDBObject()
          {
               this._DateField = DateTime.Now;
          }
    }
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.这是有效的,虽然它首先使我感到困惑,因为当从数据库中提取现有对象时,构造函数也会被调用 - 但是在这些情况下,`DateTime.Now`在构造之后被数据库值覆盖. (3认同)

and*_*dyp 5

您可以使用数据库触发器,在插入时,它会检查插入的值是否为DateTime.MinValue(01.01.0001),并将其替换为您想要的计算值.此MSDN文章介绍了如何创建触发器.

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

  • 好点子.那也行得通.但这只是感觉我正在挥动大锤来破解核桃. (3认同)

Ada*_*ley 1

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

  • 如果这样做,存储的日期将不是 EF 上下文代码运行的日期(可能是客户端),而是数据库服务器。这意味着用户可以通过更改 PC 上的时间来“伪造”日期。 (3认同)