实体框架6 ObjectMaterialized事件和SaveChanges覆盖

时间:2016-12-16 23:08:21

标签: c# entity-framework-6 savechanges

我使用的是Model First方法,我有一个抽象类MyEntity,它有几个带有属性[NotMapped]的标志。我的所有实体都继承自MyEntity。在ObjectMaterialized事件处理程序中,我设置了这些标志以指示实体已实现以及与我的应用程序相关的内容。

在我的SaveChanges()覆盖中,我调用base.SaveChanges()然后重置这些标志。它似乎导致实体更新到数据库,尽管没有真正的数据更改。

我的问题是:

  1. 这些标志没有映射到数据库列,为什么更改它们会导致实体更新到数据库?

  2. 我试图将这些标志放入部分类中,而不是每个实体继承的抽象类。似乎那些标志更改仍会导致实体更新到数据库。那是为什么?

  3. 我还尝试在base.SaveChanges()之前重置它们之后将这些标志属性设置为不变。虽然这不会导致数据库更新,但我的应用程序没有正常运行。此方法基本上与实体/属性State一起使用以避免更新数据库。但它可能导致什么副作用?

1 个答案:

答案 0 :(得分:0)

最后,我通过将实体状态更改为EntityState.Unchanged来解决此问题。它适用于我的应用程序。但是关于如何改变国家仍然存在一个问题。

以下方式改变状态导致问题:

dbContext.Entry(entity.Entity).State = EntityState.Unchanged;

我必须使用以下代码更改状态:

ObjectStateEntry state = ((IObjectContextAdapter)dbContext).ObjectContext.ObjectStateManager.GetObjectStateEntry(entity.Entity);
state.ChangeState(EntityState.Unchanged);