问题
当我创建我的帐户类作为示例A时,对象在我的SaveChanges() - 方法中按预期显示状态为"EntityState.Modified".
当我使用示例B时,该对象显示为"EntityState.Unchanged",并且在GetObjectStateEntries(EntityState.Added | EntityState.Modified)调用的结果中没有apear.
任何人都可以向我解释,为什么模型对象在示例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
在数据库中具有旧值.