У меня есть родительская сущность (Лечение) с коллекцией дочерних сущностей (Сегменты). У меня есть метод сохранения, который выполняет обработку, определяет, является ли он новым или существующим, а затем либо добавляет его в objectContext, либо присоединяет его к контексту объекта в зависимости от того, новый он или существующий.
То же самое происходит с детьми в основном существе. Он перебирает коллекцию дочерних объектов, а затем добавляет или обновляет в зависимости от ситуации.
То, что я пытаюсь сделать, это удалить все дочерние объекты, которые отсутствуют. Проблема заключается в том, что когда я обновляю родительский объект, а затем присоединяю его к контексту объекта, у родительского объекта появляется коллекция дочерних объектов из БД. Это не коллекция, в которую я был первоначально передан. Поэтому, если у меня была обработка с 3 сегментами, и я удаляю один сегмент из коллекции, а затем передаю обработку в мой метод сохранения, как только объект обработки присоединяется к объектному контексту, количество сегментов изменилось с 2 на 3.
Что я делаю не так?
Вот код моего метода сохранения:
public bool Save(Treatment myTreatment, modelEntities myObjectContext)
{
bool result = false;
if (myObjectContext != null)
{
if (myTreatment.Treatment_ID == 0)
{
myObjectContext.Treatments.AddObject(myTreatment);
}
else
{
if (myTreatment.EntityState == System.Data.EntityState.Detached)
{
myObjectContext.Treatments.Attach(myTreatment);
}
myObjectContext.ObjectStateManager.ChangeObjectState(myTreatment, System.Data.EntityState.Modified);
myObjectContext.Treatments.ApplyCurrentValues(myTreatment);
}
foreach (Segment mySegment in myTreatment.Segments)
{
if (mySegment.SegmentID == 0)
{
myObjectContext.ObjectStateManager.ChangeObjectState(mySegment, System.Data.EntityState.Added);
myObjectContext.Segments.AddObject(mySegment);
}
else
{
if (mySegment.EntityState == System.Data.EntityState.Detached)
{
myObjectContext.Segments.Attach(mySegment);
}
myObjectContext.ObjectStateManager.ChangeObjectState(mySegment, System.Data.EntityState.Modified);
myObjectContext.Segments.ApplyCurrentValues(mySegment);
}
}
}
result = (myObjectContext.SaveChanges(SaveOptions.None) != 0);
return result;
}
* EDIT ****
Основываясь на некоторых комментариях ниже, я изменил метод «Сохранить». Реализация нового метода приведена ниже. Однако он по-прежнему не удаляет сегменты, которые были удалены из коллекции myTreatments.Segments.
public bool Save(Treatment myTreatment, tamcEntities myObjectContext)
{
bool result = false;
if (myObjectContext != null)
{
if (myTreatment.Treatment_ID == 0)
{
myObjectContext.Treatments.AddObject(myTreatment);
}
else
{
if (myTreatment.EntityState == System.Data.EntityState.Detached)
{
myObjectContext.Treatments.Attach(myTreatment);
}
myObjectContext.ObjectStateManager.ChangeObjectState(myTreatment, System.Data.EntityState.Modified);
}
foreach (Segment mySegment in myTreatment.Segments)
{
if (mySegment.SegmentID == 0)
{
myObjectContext.ObjectStateManager.ChangeObjectState(mySegment, System.Data.EntityState.Added);
}
else
{
myObjectContext.ObjectStateManager.ChangeObjectState(mySegment, System.Data.EntityState.Modified);
}
}
}
result = (myObjectContext.SaveChanges(SaveOptions.None) != 0);
return result;
}
ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ
Я наконец получил это, чтобы работать. Вот обновленный метод Save, который работает правильно. Мне пришлось сохранить первоначальный список сегментов в локальной переменной, а затем сравнить его со списком myTreatments.Segments после его присоединения к БД, чтобы определить список сегментов, которые нужно удалить, а затем выполнить итерацию по этому списку и удалить соответствующие Сегменты из недавно добавленного списка myTreatment.Segments. Я также удалил передачу объекта objectcontext по совету нескольких респондентов ниже.
public bool Save(Treatment myTreatment)
{
bool result = false;
List<Segment> myTreatmentSegments = myTreatment.Segments.ToList<Segment>();
using (tamcEntities myObjectContext = new tamcEntities())
{
if (myTreatment.Treatment_ID == 0)
{
myObjectContext.Treatments.AddObject(myTreatment);
}
else
{
if (myTreatment.EntityState == System.Data.EntityState.Detached)
{
myObjectContext.Treatments.Attach(myTreatment);
}
myObjectContext.ObjectStateManager.ChangeObjectState(myTreatment, System.Data.EntityState.Modified);
}
// Iterate over all the segments in myTreatment.Segments and update their EntityState to force
// them to update in the DB.
foreach (Segment mySegment in myTreatment.Segments)
{
if (mySegment.SegmentID == 0)
{
myObjectContext.ObjectStateManager.ChangeObjectState(mySegment, System.Data.EntityState.Added);
}
else
{
myObjectContext.ObjectStateManager.ChangeObjectState(mySegment, System.Data.EntityState.Modified);
}
}
// Create list of "Deleted" segments
List<Segment> myDeletedSegments = new List<Segment>();
foreach (Segment mySegment in myTreatment.Segments)
{
if (!myTreatmentSegments.Contains(mySegment))
{
myDeletedSegments.Add(mySegment);
}
}
// Iterate over list of "Deleted" segments and delete the matching segment from myTreatment.Segments
foreach (Segment mySegment in myDeletedSegments)
{
myObjectContext.ObjectStateManager.ChangeObjectState(mySegment, System.Data.EntityState.Deleted);
}
result = (myObjectContext.SaveChanges(SaveOptions.None) != 0);
}
return result;
}