(Я считаю, что это та самая проблема, что этот, но там нет ответа, и я думаю, что я могу лучше выразить эту проблему здесь...)
У меня есть два класса 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 сделала бы такую огромную ошибку - так должно быть, что где-то мое собственное понимание ошибочно.
Может кто-нибудь объяснить, что я делаю неправильно, и какой правильный подход здесь?
Спасибо!
Является ли функция State.GetState(...)
использующим тот же файл данных, что и MyDataContext.GetTable<County>()
?
Джон Бокер спросил:
- это функция State.GetState(...) используя тот же файл данных, что и MyDataContext.GetTable()?
Мой ответ был "Да" - они используют один и тот же класс DataContext... но они использовали разные экземпляры.
Извлеченный урок: всегда используют тот же экземпляр вашего класса DataContext для любых объектов, которые вы планируете сохранять в своей базе данных!
(Джон получает кредит на ответ, так или иначе...)
Что-то здесь не так. Я предполагаю, что 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 является родительской таблицей, вам нужно добавить графства в коллекцию графств штата.
Если государство не использовало один и тот же экземпляр DataContext, он мог бы сначала вызвать метод Attach.