如何更新第二个ObjectContext并删除第一个ObjectContext

时间:2010-12-06 12:39:15

标签: c# entity-framework many-to-many

我有多对多的关系患者 - 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仍然拥有它。

这是预期的行为吗?

1 个答案:

答案 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

搜索实体框架上下文生命周期,对此主题进行了大量讨论,可能有助于您确定适合您需求的路径。