我想清楚了ObjectStateManager,这样的的DbContext调用SaveChanges();
后下面的行不返回结果:如何清除ObjectStateManager
dbContext.ObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Unchanged);
的行为似乎是所有对象(添加,修改)在ObjectStateManager中将状态更改为Unchanged
,所以代码将全部返回。有没有办法清除它?
我需要这个,因为我重新使用上下文并为实体带来了不变的状态,但由于ObjectSateManager增长并随着不变的实体增长(因为它在SaveChanges之后将它们全部更改为不变),因此,一个实体一遍又一遍。
编辑:
为什么分离方法心不是为我工作:
假设您有2类:
public class Nation
{
public string Name { get; set; }
public ICollection<City> Cities { get; set; }
}
public class City
{
public string Name { get; set; }
public Nation Nation { get; set; }
}
现在我已经传送到的SaveChanges一个国家项目与一些城市需要更新或插入。
让我们假设如下:
var canada = new Nation()
{
Name = "Canada",
}
canada.Cities = new City[]
{
new City(){ Name = "Ottawa", Nation = canada, },
new City(){ Name = "Edmonton", Nation = canada, },
new City(){ Name = "Victoria", Nation = canada, },
new City(){ Name = "Torronto", Nation = canada, }
},
}
现在,我有我的ObjectStateManager内不变的状态所有这些对象。 (SaveChanges调用后)
我比他们通过循环并设置状态不变,这个结果在每个城市有Nation = null
和Nation.Cities being empty
。此外
dbContext.ObjectContext.Detach(entity);
,如果你不是需要连接的实体,则可以使用AsNoTracking()
扩展方法:
您应该保持尽可能短的时间。在整个应用程序中共享/重用上下文是一个坏主意。 – MarcinJuraszek
@MarcinJuraszek我正在做一个Import方法,它调用每个元素的SaveChanges,因为我想获得每个结果的即时反馈,因为整个Import总共有10.000个实体来保存,我相信使用一个上下文和一个事务是比试图用1创建10.000个上下文更好? transcation进行完全回滚。 –
你需要分离的实体是什么?一旦他们得救,你是不是完成了与他们的合作? – ivowiblo