如何使用默认的entity framework和默认日期值

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

我认为lazyberezovsky在另一个问题上提供的答案是这个问题的直接解决方案entity framework和默认日期

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