实体框架:设置更新时间戳

Rai*_*oad 10 entity-framework

我们所有的数据库表都有UpdateUserID和UpdateTS.如果我的实体有变化,我想要这套.有没有办法可以有条件地在现场进行此更新?

如果我在代码中手动设置UpdateTS,那么它将说明我的实体已更改并将始终更新该对象.

San*_*ken 7

我在调用之前调用此扩展方法context.SaveChanges():

public static void SetLastModified(this ObjectContext context, DateTime dateTime)
{
    DateTime now = DateTime.UtcNow;
    foreach (ObjectStateEntry entry in context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified))
    {
        if (!entry.IsRelationship)
        {
            IHasLastModified lastModified = entry.Entity as IHasLastModified;
            if (lastModified != null)
                lastModified.LastModified = now;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以轻松地调用此代码,因为我将ObjectContext包装在存储库类中.如果您正在使用它,您可以将ObjectContext.SavingChanges事件挂钩以执行类似的操作.

  • 我确保我的数据对象有一个名为 LastModified 的“DateTime”属性,然后在分部类中实现该接口(因此代码生成不会丢弃它)。因为属性已经存在,所以没有代码可以实现 (2认同)

Eri*_* J. 6

以下是其他两个想法的实现,并考虑以下因素

  • 确保在调用SaveChanges()之前创建自动检测更改的代理,或者手动检测到更改的代理.如果不是,则对象状态为EntityState.Unmodified,并且不会更新上次修改的时间戳.
  • 我已经扩展了代码,以便在首次创建对象时设置上次修改的时间戳(EntityState.Added)

代码

public interface IHasLastModified
{
    DateTime? LastModified { get; set; }
}

public class MyClass : IHasLastModified
{
    public virtual int Id { get; set; }

    public virtual string SomeOtherProperty { get; set; }

    public virtual DateTime? LastModified { get; set; }
}

public class MyContext : DbContext
{
    public override int SaveChanges()
    {            
        DateTime now = DateTime.UtcNow;
        foreach (ObjectStateEntry entry in (this as IObjectContextAdapter).ObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified))
        {
            if (!entry.IsRelationship)
            {
                IHasLastModified lastModified = entry.Entity as IHasLastModified;
                if (lastModified != null)
                    lastModified.LastModified = now;
            }
        }

        return base.SaveChanges();
    }
Run Code Online (Sandbox Code Playgroud)

  • @Anders:只需发布你自己的答案并进行修改即可。您可以参考我的答案并指出您的答案如何正确处理无代理实体。 (2认同)