例如,我的大多数实体都有DateCreated和DateModified字段。这些默认设置在SQL Server中设置为GetUtcDate()。
如果我尝试创建一个实体并且没有设置这些值,我会得到一个异常,说它无法运行SQL插入,因为日期值超出了范围。有意义,因为C#默认日期是1/1/0001,而SQL Server的最小日期是1/1/1753。
那么有没有办法告诉EF要么使用SQL Server默认值,要么尝试插入尚未设置的列?
答案 0 :(得分:12)
您必须将这些属性的StoreGeneratedPattern
设置为Identity
的{{1}}和DateCreated
的{{1}}。它是设计师提供的。执行此操作后,您无法在应用程序中修改这些值 - 只有数据库可以设置这些属性。我写了关于这个some article的文章,因为这个功能在VS2010 SP1之前有错误,但是有报告称它有时仍然不起作用。
答案 1 :(得分:4)
一种解决方案是使用部分覆盖生成的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集合中删除它们?
答案 2 :(得分:0)
您是否尝试在实体中设置属性的默认值?