问题
当我创建我的Account-class作为示例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()调用的情况下重现工作示例。
答案 0 :(得分:9)
您应该在覆盖的SaveChanges
方法的开头手动调用更改检测:
public override int SaveChanges()
{
this.ChangeTracker.DetectChanges();
//...
}
我没有解释为什么实体状态可能与模型A和模型B不同。但是对DetectChanges
的缺失调用通常可能是实体处于状态Unchanged
(暂时)的原因虽然它已被修改。例如,如果您有POCO实体(不是更改跟踪代理),只需加载实体,更改属性,然后调用被覆盖的SaveChanges
状态为Unchanged
,直到 {调用{1}}将状态更新为base.SaveChanges
并将更改保存到数据库。但是,设置Modified
属性的代码将被跳过,LastUpdated
在数据库中具有旧值。