是否有一种简单的方法可以使EntityFramework使用SQL默认值?

例如,我的大多数实体都有DateCreated和DateModified字段。 这些默认设置在SQL Server中设置为GetUtcDate()。

如果我尝试创建一个实体并且不设置这些值,我会得到一个exception,说它无法运行SQL插入,因为日期值超出范围。 有意义,因为C#默认日期是1/1/0001,而SQL Server的最小日期是1/1/1753。

那么有没有办法告诉EF要么使用SQL Server默认值,要么尝试插入尚未设置的列?

您必须将这些属性的StoreGeneratedPattern设置为DateCreated IdentityDataModified Computed 。 它是设计师提供的。 执行此操作后,您无法在应用程序中修改这些值 – 只有数据库可以设置这些属性。 我写了一篇关于这篇文章的文章,因为这个特性在VS2010 SP1之前有bug,但是有报道称它有时仍然不起作用。

一种解决方案是使用partial覆盖生成的entitycontext类。 这将拦截EF上下文中所有实体类的插入/更新:

 public partial class MyEntities : ObjectContext { public override int SaveChanges(SaveOptions options) { this.DetectChanges(); foreach (var insert in this.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added)) { if (insert.Entity.HasProperty("DateCreated")) insert.Entity.GetType().GetProperty("DateCreated").SetValue(insert.Entity, DateTime.UtcNow, null); if (insert.Entity.HasProperty("LastModified")) insert.Entity.GetType().GetProperty("LastModified").SetValue(insert.Entity, DateTime.UtcNow, null); } foreach (var update in this.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Modified)) { if (update.Entity.HasProperty("LastModified")) update.Entity.GetType().GetProperty("LastModified").SetValue(update.Entity, DateTime.UtcNow, null); } return base.SaveChanges(options); } } 

或者做类似的事情,在datestamp字段中查找插入/更新并从ObjectStateEntries集合中删除它们?

您是否尝试在实体中设置Property的DefaultValue?