【问题标题】:Using Entity Framework 6 and modifying a record EntityState.Modified not being set使用 Entity Framework 6 并修改记录 EntityState.Modified 未设置
【发布时间】:2018-04-10 01:50:46
【问题描述】:

使用以下代码使用 EF6 更新表中的记录,记录会更新,但 EntityState.Modified 不正确。

var result = dbContext.MyUsers.Find(8);
result.UserName = "Tony Baloney";
db.SaveChanges();

记录已按预期更新,但我已覆盖 SaveChanges 以检查是否添加或更新了记录,以便我可以根据需要添加创建日期或修改日期。 添加EntityState.Added 时为真,但使用上述代码更新时EntityState.Modified 不为真。 这是为什么?

我的 SaveChanges 覆盖代码是:

 public override int SaveChanges()
    {
       ObjectContext context = ((IObjectContextAdapter)this).ObjectContext;
       var objectStateEntries = context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)
            .Where(e => !e.IsRelationship && e.Entity != null && typeof(EntityBase).IsAssignableFrom(e.Entity.GetType()))
            .ToList();

        var currentTime = DateTime.Now;
        foreach (var entry in objectStateEntries)
        {
            var entityBase = entry.Entity as EntityBase;
            if (entry.State == EntityState.Added)
            {
                entityBase.CreateDate = currentTime;
            }
            entityBase.UpdateDate = currentTime;
        }

        return base.SaveChanges();
    }

【问题讨论】:

  • 结果状态如何?
  • 不确定我是否理解您的问题或知道如何确定。我假设根据上面我更改值 username 的行进行了修改
  • 您可以检查它是否存在于 objectStateEntries 中。如果是,则进行修改。
  • objectStateEntries 中为 null。

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


【解决方案1】:

为了让 SaveChanges 的覆盖生效,我必须添加

context.DetectChanges();

在检查实体状态之前实例化上下文(覆盖的第二行)之后。这样就可以正确看到实体状态。如果不添加检测更改行,必须在调用代码中专门设置 EntityState。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2017-11-20
    • 2014-01-04
    相关资源
    最近更新 更多