【问题标题】:EF - Automatic update of a field when another is updating (Last Update Date)EF - 当另一个正在更新时自动更新一个字段(最后更新日期)
【发布时间】:2013-07-28 10:15:33
【问题描述】:

假设我有以下对象

public class Car{
     public int id;
     public string name;
     public string color;
     publid DateTime LastUpdateDate;
}

public class CarPart{
     public int id;
     public string name;
     public string color;
}

每当有人更新任何字段时,我都希望更新 LastUpdateDate 字段。
我最糟糕的设计是写如下内容

public void setName(string name){
    this.name=name;
    this.LastUpdateDate = DateTime.now;
}  

一个。这些类是自动生成的,我必须保留一个部分。
湾。太耦合了。

  1. 是否有推荐的框架/设计模式可以用来解决这个问题?
  2. Entityframework 是否具有处理此要求的功能。

注意:我正在寻找可以处理对象(Car)及其多值(CarPart)对象中的字段更改的东西 谢谢。

【问题讨论】:

  • 这里没有给出答案.. 但是在你的 c# 中保持日期会给服务器日期.. 在 Db 端使用 GetDate() 来保持多台服务器的一致性会不会更好跨度>
  • 我认为这是一个非常好的评论。顺便说一句:不应该在表触发器上完成吗?
  • 是的,我觉得这是最恰当的......只是我们总是更喜欢在 Db 端而不是服务器上有任何日期,除非我们需要服务器端日期,但这些日期会在 xml 中,所以不是真正代表任何列。谢谢
  • 我知道这个线程已经快 1 年了,但我建议在存储这些东西时使用 UTC 日期......所以哪个服务器提供日期并不重要。此外,如果使用 SQL Server 的日期函数,则有一个 GetUtcDate() 等效项。

标签: c# entity-framework entity-framework-4


【解决方案1】:

大多数人倾向于覆盖 Context 的 SaveChanges() 方法进行审计。

首先创建一个IAuditable 接口并将其应用于您要审核的所有实体:

public interface IAuditable
{
    public DateTime? LastUpdateDate { get; set; }
}

然后在你的Context:

public override int SaveChanges()
{
      var entries = ChangeTracker.Entries()
                                 .Where(e => e.State == EntityState.Modified);

      foreach (var entry in entries)
      {
            var auditableEntity = entry.Entity as IAuditable;

            if (auditableEntity  != null)
                auditableEntity.LastUpdateDate = DateTime.UtcNow;
      }

      return base.SaveChanges();
}

还有,看看

  1. AuditDbContext
  2. Entity Framework 6 Interception(新功能)。

【讨论】:

  • 更正我错了..但这不是明确设置日期吗? ..设计有什么变化
  • @RameezAhmedSayad,是的,它确实明确设置了日期。根据您上面的评论,依赖 DB GetDate() 确实更好,但取决于每个项目的要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
相关资源
最近更新 更多