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

Rac*_*hel 12 c# sql-server entity-framework

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

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

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

Lad*_*nka 12

您必须StoreGeneratedPatternIdentityfor DateCreatedComputedfor 设置这些属性DataModified.它是设计师提供的.执行此操作后,您无法在应用程序中修改这些值 - 只有数据库可以设置这些属性.我写了一篇关于这篇文章的文章,因为这个特性在VS2010 SP1之前有错误,但是有报道称它有时仍然无效.


Jam*_*ack 5

一种解决方案是使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

还是做类似的事情,在datestamp字段上查找插入/更新并将其从ObjectStateEntries集合中删除?