Как обновить второй ObjectContext с удалениями, сделанными на первом - PullRequest
0 голосов
/ 06 декабря 2010

У меня есть отношение многие ко многим Пациенты - 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();

отношение1а и отношение2а имеют одну запись. Отношение1b не имеет записи, но отношение2b имеет одну запись. Даже если работа с обновлениями перед запросом:

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);

отношение обновляется должным образом. Жаль, что без обновления entity2.PatientDevices больше не содержится удаленный объект, но entity2.Patients.First (). PatientDevices все еще имеет.

Это предполагаемое поведение?

1 Ответ

0 голосов
/ 07 декабря 2010

Если вам нужно иметь несколько контекстов и работать напрямую с вашими сущностями, взгляните на методы 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

Выполните поиск по времени существования контекста структуры сущности, по этому вопросу много дискуссий, которые могут помочь вам выбрать маршрут, который соответствует вашим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...