Linq проблема со вставкой новых строк, которые имеют ссылки на существующие записи - PullRequest
1 голос
/ 28 апреля 2009

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

У меня есть два класса 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 сделала бы такую ​​грубую ошибку - поэтому, должно быть, где-то мое понимание неверно.

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

Спасибо!

Ответы [ 4 ]

0 голосов
/ 28 апреля 2009

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

0 голосов
/ 28 апреля 2009

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

0 голосов
/ 28 апреля 2009

Решено!

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

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

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

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

(в любом случае Джон получает кредит за ответ ...)

0 голосов
/ 28 апреля 2009

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

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();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...