Позвольте мне связать мой опыт с этой неприятной ошибкой и указать на погоню за ландшафтом, которая приведет вас к чрезвычайно простому решению.
CompanyGroup довольно прост. У него есть имя и объект Company.
Я начал с этого:
1 public static void Add(CompanyGroup item)
2 {
3 try
4 {
5 using (Entities scope = new Entities())
6 {
7 scope.AddToCompanyGroup(item);
8 scope.SaveChanges();
9 }
10 }
11 catch (Exception ex)
12 {
13 LogException(ex, item);
14 throw;
15 }
16 }
И получил эту ошибку:
{"Объект сущности не может быть
ссылки на несколько экземпляров
IEntityChangeTracker. "}
Итак, я добавил это между строками 6 и 7:
(IEntityWithChangeTracker)item).SetChangeTracker(null);
Это вознаградило меня:
{"Невозможно добавить объект в
ObjectStateManager, потому что это уже
имеет EntityKey. использование
ObjectContext.Attach, чтобы прикрепить
объект с существующим ключом. "}
Итак, я изменился
scope.AddToCompanyGroup(item);
до
scope.Attach(item);
Теперь жаловались на:
{"Объект с временным EntityKey
значение не может быть привязано к объекту
контекст. "}
(начинает походить на некоторых девушек, с которыми я встречался в юности - никогда не довольствуюсь - но я отвлекаюсь)
Итак, я сделал ключ сущности пустым (не работал) и использовал метод для создания нового (тоже не работал)
Попутно я тоже получил эту ошибку:
{"Исходный запрос для этого
EntityCollection или EntityReference
не может быть возвращен, когда связанный
объект находится в добавленном состоянии или
отдельное государство и не было
первоначально получены с использованием
Опция слияния NoTracking. "}
Решение?
Заменить ядро, строки 7 и 8, на:
CompanyGroup newcg = new CompanyGroup();
newcg.GroupName = item.GroupName;
newcg.Company = scope.Company.Where(c => c.CompanyID == item.Company.CompanyID).First();
scope.AddToCompanyGroup(newcg);
scope.SaveChanges();
По сути, я взял данные, переданные через 'item', и переместил их во вновь созданный объект того же типа, который представляет тот же самый
область как та, которая используется в Add.