实体框架6-预期GetObjectStateEntries修改后的实体的状态为“未更改”

斯蒂芬·莫勒(StephanMøller)

问题

当我创建示例A的Account类时,该对象将在SaveChanges()方法中显示为状态为“ EntityState.Modified”。

当我使用示例B时,该对象显示为“ EntityState.Unchanged”,并且在GetObjectStateEntries(EntityState.Added | EntityState.Modified)调用的结果中没有出现。

谁能向我解释,为什么样例B在样例A中一切正常时为什么模型对象没有变化?

谢谢

班级

我在Context对象中使用此方法更新了“ Created”和“ LastUpdated”:

public class CrmContext : DbContext
{

public override int SaveChanges()
{
    DateTime now = DateTime.Now;
    foreach (ObjectStateEntry entry in (this as IObjectContextAdapter).ObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified))
    {
        if (!entry.IsRelationship)
        {
            var account = entry.Entity as Account;
            if (account != null)
            {
                account.LastUpdated = now;
                if (entry.State == EntityState.Added)
                {
                    account.Created = now;
                }
            }
        }
    }

    return base.SaveChanges();
}

}

模型示例A(工作中):

public class Account
{
 [Key]
 public int AccountId { get; set; }
 public string Name { get; set; }
 [Timestamp]
 public Byte[] TimeStamp { get; set; }
 public DateTime Created { get; set; }
 public DateTime LastUpdated { get; set; }
}

型号示例B(不工作):

public class Account : BaseObject
{
 [Key]
 public int AccountId { get; set; }
 public string Name { get; set; }
}
public class BaseObject
{
 [Timestamp]
 public Byte[] TimeStamp { get; set; }
 public DateTime Created { get; set; }
 public DateTime LastUpdated { get; set; }
}

更新:

问题似乎与模型类是否从基类继承无关,因为如果不使用建议的DetectChanges()调用,我将无法重现工作示例。

贫民窟

您应该在覆盖SaveChanges方法的开头手动调用更改检测

public override int SaveChanges()
{
    this.ChangeTracker.DetectChanges();

    //...
}

我没有解释为什么模型A和模型B的实体状态可能会有所不同。但是,缺少对的调用DetectChanges通常可以是Unchanged尽管已对其进行了修改,但实体处于(暂时)状态的原因例如,如果您具有POCO实体(而不是更改跟踪代理),则只需加载一个实体,更改一个属性,然后调用被覆盖SaveChanges的状态,Unchanged 直到 base.SaveChanges被调用为止,这会将状态更新为Modified并将更改保存到数据库。但是设置LastUpdated属性的代码将被跳过,LastUpdated并在数据库中具有旧值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章