Добавить элемент и обновить отношения в переходной таблице в базе данных "многие ко многим" Sql Server
- была неправильная модель без ассоциации многих людей между AB. исправлено в EDIT2--
A
существует в базе данных, B
существует в базе данных. Мне нужно только ввести новый C
элемент с некоторыми Properties1 и Properties2 (и обновить коллекции C
в существовал A
а также B
элементы)
Я перепробовал много вариантов, например, такой, но все-таки что-то не так (с ObjectOCntext и существующим ключом и т. Д.)
void SaveNewC(C newC)
{
using (var context = new MyEntities(connectionString))
{
var dbA = context.A.Where(a => a.Id == newC.A.Id).SingleOrDefault();
var dbB = context.B.Where(b => b.Id == newC.B.Id).SingleOrDefault();
newC.A = dbA;
newC.B = dbB;
context.AddObject(newC);
context.SaveChanges();
}
}
РЕДАКТИРОВАТЬ
Исключение, которое я получаю: "An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key."
EDIT2 обновленная модель
3 ответа
context.Entry(dbA).State = EntityState.Unchanged;
context.Entry(dbB).State = EntityState.Unchanged;
context.AddObject(newC);
context.SaveChanges();
Вам нужно сопоставить соединительную таблицу? Если все, чего вы хотите - это "многие ко многим" от A->B, вы можете сделать это проще.
Если вы создали таблицу C как истинное соединение - и для FK в A и B установлено значение PK в sql следующим образом:
Затем, когда вы создадите свой edmx из модели, он создаст это:
Теперь, в своем коде, если вы хотите добавить связь, вы просто добавите ее в свою коллекцию, и EF автоматически создаст связь в вашей таблице C для вас:
var A = new A();
var b = new B();
var b2 = new B();
A.B.Add(b);
A.B.Add(b2);
Видимо твой newC
уже заполнены навигационные свойства A
а также B
с правильным Id
s. Затем вы можете просто прикрепить объекты, на которые ссылаются свойства навигации, к контексту:
void SaveNewC(C newC)
{
using (var context = new MyEntities(connectionString))
{
context.A.Attach(newC.A);
context.B.Attach(newC.B);
context.C.AddObject(newC);
context.SaveChanges();
}
}