Я новичок в Entity Framework и имею следующую проблему:
Я получаю список объектов из ObjectContext (RepEntities), который используется для заполнения сетки. Сетка позволяет пользователям изменять и выбирать связанные объекты. После этого я добавляю выбранные объекты в другой родительский объект. Проблема заключается в том, что когда свойство изменяется для определенного объекта, оно также меняет свойство в других родительских объектах, имеющих тот же выбранный дочерний объект. Поэтому ObjectSet каждый раз возвращает ссылку на одни и те же объекты.
Я решил свою проблему, вручную клонировав объекты в ObjectSet следующим образом:
public List<mblDataItem> GetSupportDataItems()
{
var items= (from e in RepEntities.jblDatItemDatTypes
where e.mblDataType.dtDsc == "Support"
select e.mblDataItem).OrderBy(p => p.diDsc).ToList();
mblDataItem di;
List<mblDataItem> diItems = new List<mblDataItem>();
foreach (var item in items)
{
di = new mblDataItem();
di.diID = item.diID;
di.diDsc = item.diDsc;
di.diSQL = item.diSQL;
di.Influence = item.Influence;
di.Comment = item.Comment;
di.PrimValue = item.PrimValue;
di.CompValue = item.CompValue;
diItems.Add(di);
}
return diItems;
}
Как правильно клонировать / дублировать ObjectSet? Кроме того, как я это делаю, я не смогу использовать свойства навигации для получения связанных сущностей.
UPDATE:
Итак, я попытался сделать это, как объяснено Клонирование сущности в Linq-to-Entities и предложено Schwarzie2478.
Это не работает для меня, так как мне нужно клонировать более одного объекта. Мне нужно иметь несколько коллекций mblDataItems, чьи свойства могут быть установлены независимо друг от друга, но при этом иметь одинаковый EntityKey, чтобы вставки выполнялись правильно. Я также заметил, что мое первое решение имеет недостатки, потому что когда я вызываю SaveChanges (), он вставляет дополнительные идентификаторы mblDataItems и затем использует вновь вставленные идентификаторы в моей соединительной таблице вместо существующих идентификаторов mblDataItem. Что я делаю неправильно?