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

时间:2010-01-19 23:12:11

标签: entity-framework

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

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

4 个答案:

答案 0 :(得分: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;
        }
    }
}

我可以轻松地调用此代码,因为我将ObjectContext包装在存储库类中。如果你正在使用它,你可以挂钩ObjectContext.SavingChanges事件来做类似的事情。

答案 1 :(得分: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();
    }

答案 2 :(得分:3)

您应该能够处理SavingChanges事件(example here)并执行@sander

概述的逻辑

答案 3 :(得分:0)

我无法使用@ eric-j提出的解决方案,它只能在创建新对象时设置日期,而在更新时不能设置日期。

我找到了this solution,并对其进行了修改以使其看起来相似。尝试了一下,它就像一个魅力。

public override int SaveChanges()
{
    var now = DateTime.UtcNow;

    var entries = ChangeTracker
        .Entries()
        .Where(e => e.State == EntityState.Added || e.State == EntityState.Modified);

    foreach (var entry in entries)
    {
        if (entry.Entity is IHasLastModified lastModified)
        {
            lastModified.LastModified = now;
            if (entry.State == EntityState.Added)
            {
                lastModified.CreatedDate = now;
            }
        }
    }

    return base.SaveChanges();
}