Добавить элемент и обновить отношения в переходной таблице в базе данных "многие ко многим" 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 с правильным Ids. Затем вы можете просто прикрепить объекты, на которые ссылаются свойства навигации, к контексту:

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();
    }
}
Другие вопросы по тегам