Linq проблема со вставкой новых строк, которые имеют ссылки на существующие записи

1

(Я считаю, что это та самая проблема, что этот, но там нет ответа, и я думаю, что я могу лучше выразить эту проблему здесь...)

У меня есть два класса Linq-to-SQL, State и County, где County имеет FK до State. Вот несколько тестовых кодов:

State s = State.GetState("NY"); // here I do a load of a State class via the Linq DataContext
County c = new County();
c.Name = "Rockland";
c.State = s;
MyDataContext.GetTable<County>().InsertOnSubmit(c);
MyDataContext.SubmitChanges(); // throws an exception

Исключение составляет "Violation of PRIMARY KEY constraint 'PK_State'. Cannot insert duplicate key in object 'dbo.State'".

Другими словами, то, что, кажется, происходит здесь, состоит в том, что, несмотря на то, что я загрузил s в качестве существующей записи, когда я пытаюсь вставить c, Linq предполагает, что все связанные объекты State включены, также необходимо вставить!

Это совершенно абсурдно, и я не могу поверить, что Microsoft сделала бы такую ​​огромную ошибку - так должно быть, что где-то мое собственное понимание ошибочно.

Может кто-нибудь объяснить, что я делаю неправильно, и какой правильный подход здесь?

Спасибо!

Теги:
linq
linq-to-sql

4 ответа

0
Лучший ответ

Является ли функция State.GetState(...) использующим тот же файл данных, что и MyDataContext.GetTable<County>()?

  • 0
    Да............
  • 0
    Не совсем полное решение - см. Мой ответ ниже: stackoverflow.com/questions/795196/…
Показать ещё 1 комментарий
0

Решено!

Джон Бокер спросил:

- это функция State.GetState(...) используя тот же файл данных, что и MyDataContext.GetTable()?

Мой ответ был "Да" - они используют один и тот же класс DataContext... но они использовали разные экземпляры.

Извлеченный урок: всегда используют тот же экземпляр вашего класса DataContext для любых объектов, которые вы планируете сохранять в своей базе данных!

(Джон получает кредит на ответ, так или иначе...)

0

Что-то здесь не так. Я предполагаю, что State → Count - это отношение ко многим. В этом случае правильный способ сделать это:

State s = State.GetState("NY"); // here I do a load of a State class via the Linq DataContext
County c = new County();
c.Name = "Rockland";

s.Counties.Add(c);
db.SubmitChanges();

Так как State является родительской таблицей, вам нужно добавить графства в коллекцию графств штата.

  • 1
    Хорошо, это все хорошо для округов; для штата может иметь смысл иметь коллекцию округов. Но скажем, у нас есть объект Person с адресом, включающим State. Собираетесь ли вы дать своему штату народную коллекцию? Я не хочу загрязнять интерфейс моего объекта State коллекциями всех таблиц Тома, Дика и Гарри, которые решают, что им нужен FK для State ...
0

Если государство не использовало один и тот же экземпляр DataContext, он мог бы сначала вызвать метод Attach.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню