EF6更改跟踪

时间:2014-09-08 01:16:55

标签: entity-framework ef-code-first entity-framework-6

我在我的EF 6数据库中通过在实体库中添加ModifiedDate属性来实现审计,并试图通过添加以下代码来覆盖SaveChanges()(取自https://stackoverflow.com/a/6282472/82152

 public class Session : ISession
    {
        public DbContext _context;

        public Session(DbContext context)
        {
            _context = context;
        }

。 。

        public int SaveChanges()
        {
            var context = ((IObjectContextAdapter)_context).ObjectContext;         

            var objectStateEntries =
                from e in context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified)
                where
                    e.IsRelationship == false &&
                    e.Entity != null &&
                    typeof(ModelBase).IsAssignableFrom(e.Entity.GetType())
                select e;

            foreach (var entry in objectStateEntries)
            {
                var modelBase = entry.Entity as ModelBase;
                modelBase.LastModifiedDate = DateTime.Now;
            }

            return _context.SaveChanges();
        }

在我更改了一个实体属性并调用了SaveChanges之后 - 我可以看到没有一个objectStateEntries被标记为EntityState.Modified。它全部标记为EntityState.Unchanged。

现在做了一些阅读后,我改变了我的SaveChanges方法来做context.DetectChanges();在第一行之后 - 这一切都奏效了。我测试了一个实例属性发生变化的情况和另一个实体属性没有变化的情况,它运行得很好。

现在关注的是

  1. 虽然我目前的解决方案有效但是性能会受到影响吗?
  2. 为什么没有context.Configuration.AutoDetectChangesEnabled = true执行从属性更改自动跟踪更改的工作?

1 个答案:

答案 0 :(得分:2)

您没有覆盖SaveChanges()。您正在创建一个新的包装类,并创建一个SaveChanges方法,然后尝试调用包装上下文的SaveChanges()。这与覆盖SaveChanges()完全不同。如果您阅读AutoDetectChangesEnabled的文档,您会发现它说明了这一点:

  

获取或设置一个值,该值指示是否通过DbContext和相关类的方法自动调用DetectChanges()方法。默认值为true。

所以这意味着当你调用DetectChanges()的方法时会调用DbContext,这是你没有做的事情。您正在调用ObjectContext的方法,该方法不属于DbContextDbContext继承自它的一部分),因此调用此方法不会触发{{1}打电话。