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

时间:2011-05-11 13:53:03

标签: c# sql-server entity-framework

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

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

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

3 个答案:

答案 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)

您是否尝试在实体中设置属性的默认值?