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

时间:2009-10-22 18:59:49

标签: c# entity-framework

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

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

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

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

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

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

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

8 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

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

所有团队必须做的就是这样:

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

日期字段可以映射到DateTime吗?只有当列在数据库中可以为空时才会生效。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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