使用Entity Framework 5自动管理和保护Created \ Updated字段

时间:2013-07-24 15:44:46

标签: sql-server-2008 entity-framework-5

我希望每个添加的\ changed记录都有一个创建\更改的时间戳。

但是 - 所以它很容易嵌入并且易于管理 - 自动。

1 个答案:

答案 0 :(得分:1)

覆盖'DbContext'类或将其嵌入'.tt'文件(Codefirst \ DBFirst)

代码假定您在POCO中有字段'CreatedOn'\'ModifiedOn'。

如果您没有它们,或者您只有一个 - 代码可以正常工作。

请注意!如果您使用扩展名(作为this),那么允许您从存储过程进行批量更新或更改 - 这将无法正常工作

修改

我找到了灵感来源 - 感谢'Nick'here

public override int SaveChanges()
{
    var context = ((IObjectContextAdapter)this).ObjectContext;
    var currentTime = DateTime.Now;
    var objectStateEntries = from v in context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)
                                where v.IsRelationship == false && v.Entity != null
                                select v;

    foreach (var entry in objectStateEntries)
    {
        var createdOnProp = entry.Entity.GetType().GetProperty("CreatedOn");
        if (createdOnProp != null)
        {
            if (entry.State == EntityState.Added)
            {
                if (createdOnProp != null)
                {
                    createdOnProp.SetValue(entry.Entity, currentTime);
                }
            }
            else
            {
                Entry(entry.Entity).Property("CreatedOn").IsModified = false;
            }
        }

        var modifiedOnProp = entry.Entity.GetType().GetProperty("ModifiedOn");
        if (modifiedOnProp != null)
        {
            modifiedOnProp.SetValue(entry.Entity, currentTime);
        }
    }

    return base.SaveChanges();
}