我有多对多的关系患者 - PatientDevices - 设备和它的基本edmx模型(没有poco,自动生成)。 PatientDevices作为实体生成,因为它的列数多于外键。
当我创建两个ObjectContexts并在第一个中添加一个新的PatientDevice时,第二个也有它。从第一个关系中删除此关系时,它仍然在第二个上下文中:
var entities1 = new TherapyDatabaseDevEntities();
var entities2 = new TherapyDatabaseDevEntities();
entities1.PatientDevices.AddObject(new PatientDevice
{
Patient = entities1.Patients.First(),
Device = entities1.Devices.First()
});
entities1.SaveChanges();
var relation1a = entities1.Patients.First().PatientDevices.ToList();
var relation2a = entities2.Patients.First().PatientDevices.ToList();
entities1.PatientDevices.DeleteObject(entities1.PatientDevices.ToList().Last());
entities1.SaveChanges();
var relation1b = entities1.Patients.First().PatientDevices.ToList();
var relation2b = entities2.Patients.First().PatientDevices.ToList();
relation1a和relation2a都有一个条目。 relation1b没有条目,但relation2b有一个条目。即使在查询之前使用刷新:
entities2.Refresh(RefreshMode.StoreWins, entities2.Patients);
entities2.Refresh(RefreshMode.StoreWins, entities2.PatientDevices);
entities2.Refresh(RefreshMode.StoreWins, entities2.Devices);
var relation1b = entities1.Patients.First().PatientDevices.ToList();
// still 1 entry
var relation2b = entities2.Patients.First().PatientDevices.ToList();
是否有可能使第二个上下文更新或者我是否必须创建另一个ObjectContext?
修改
我发现如果我这样做:
entities2.Refresh(RefreshMode.StoreWins, entities2.Patients.First().PatientDevices);
关系得到正确更新。遗憾的是,没有刷新实体.PatientDevices不再包含已删除的对象,但实体2.Patients.First()。PatientDevices仍然拥有它。
这是预期的行为吗?
答案 0 :(得分:0)
如果您必须有多个上下文并直接使用您的实体,请查看Attach和Detach方法,其名称建议用于将对象与从中检索的上下文关联/分离。请注意,这些方法只会将您传递的对象作为参数进行分离,而不是关联对象,因此您可能必须遍历连接的对象,从而分离每个对象,这很麻烦。
var entities1 = new TherapyDatabaseDevEntities();
var patient1 = entities1.Patients.Single(p => p.Id = 12345);
entities1.Detach(patient1);
//loop through associated entities calling Detach on each
var entities2 = new TherapyDatabaseDevEntities();
entities2.Attach(patient1);
//loop through associated entities calling Attach on each
我的偏好是使用viewmodels,这样你就不会直接编辑实体,而是使用它们的表示。当用户显式保存对象时,检索该对象并仅在新的上下文中更新该对象的更改。
var entities1 = new TherapyDatabaseDevEntities();
var patient1 = entities1.Patients.Single(p => p.Id = 12345);
...处理您的上下文,不再需要它,并在此处进行更改
var entities2 = new TherapyDatabaseDevEntities();
var patient2 = entities2.Patients.Single(p => p.Id = 12345);
patient2.Property1 = patient1.Property1;
...使用其他更改进行更新(有方法可以使此代码更清晰,只显示最简单的示例)
entities2.SaveChanges();
entities2.Dispose();
有关附加/分离的参考资料 - http://msdn.microsoft.com/en-us/library/bb896271.aspx
搜索实体框架上下文生命周期,对此主题进行了大量讨论,可能有助于您确定适合您需求的路径。