Это обычное поведение. Проблема в том, что EF не знает, что вы прикрепили существующий B
, поэтому он автоматически вставляет новую запись. Вы должны сказать EF, что B
существует, позвонив по номеру:
// here add B to the collection in the A and after that call:
dbContext.Entry<B>(someB).State = EntityState.Unchanged();
или прикрепив B
перед добавлением его в коллекцию в A
(я не уверен, возможно ли это при использовании UpdateModel
в ASP.NET MVC).
dbContext.Bs.Attach(someB);
// now add B to the collection in the A
Другая возможность - сначала загрузить B
из базы данных и добавить загруженный объект в коллекцию в A
, но это дополнительная передача туда и обратно в базу данных.
int id = someB.Id;
var loadedB = dbCotnext.Bs.Single(b => b.Id == id);
someA.Bs.Add(loadedB);
dbContext.As.Add(someA);
dbContext.SaveChanges();
Вывод: каждый раз, когда вы вызываете Add
, весь граф объектов отслеживается как вставленный, если вы сначала не присоединяете связанные сущности (перед тем, как добавить их к вставленному родителю - 2-й и 3-й пример) или если вы вручную не изменили состояние связанной сущности вернуться к неизменным после добавления родителя. (1-й пример).