Как эффективно обновить внешний ключ в LINQ to SQL / SQLMetal? - PullRequest
6 голосов
/ 03 сентября 2010

Я столкнулся с проблемой при попытке обновить поле внешнего ключа:

record.ForeignId = newId;

Бомба с надписью "Операция недопустима из-за текущего состояния объекта" из-за кода SQLMetal, который выдает System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException().

Я не первый, кто столкнулся с этой проблемой:

Ошибка LinqToSQL: операция недопустима из-за текущего состояния объекта и http://social.msdn.microsoft.com/forums/en-US/linqtosql/thread/f9c4a01a-195a-4f2b-a1cb-e2fa06e28b25/ обсудить это, среди прочего.

Их решение таково:

record.Foreign = Database.Foreigns.Single(c => c.Id == newId);

Это, конечно, вызывает поиск в БД по Иностранному только для того, чтобы вернуть объект, который уже имеет Id Iзнать!Итак, как мне выполнить это обновление без бессмысленного запроса (или запросов, если у меня много этих FK)?

Ответы [ 3 ]

3 голосов
/ 03 сентября 2010

Вы можете создать экземпляр родительского объекта (с правильным идентификатором), Attach передать его в текстовый текст в качестве существующего состояния записи, а затем присвоить свойству Parent вашего дочернего объекта.

Вот некоторыекод:

int theId = 5;
Parent p = new Parent() { Id = theId};
dc.Parents.Attach(p);
child.Parent = p;
1 голос
/ 07 марта 2013

Это не решает проблему, но один из способов частично обойти дополнительную нагрузку - проверить, отличается ли существующее значение от нового.Если это не так, вы будете подвергаться запросу.Что-то вроде -

if(obj.PropertyID != newValue){
  obj.Property = PropertyClass.Load(newValue)
}
0 голосов
/ 30 декабря 2014

У меня была такая же проблема. Я создал быстрый обходной путь, возможно, не лучшее решение (так как оно может повлиять на производительность), но оно сработало для меня.

В моем решении у меня есть класс с моим DataContext, объявленным на уровне класса, поэтому я могу использовать его повсюду.

В моем решении все, что я хотел сделать (аналогично вам), - это изменить идентификатор типа учетной записи на другой идентификатор типа учетной записи (в базе данных это FK) для пользователя.

Поскольку DataContext уже был загружен, изменение не разрешалось. Работа вокруг?

Я создал функцию, в которой я создаю новый экземпляр DataContext, запускаю запрос LINQ, отправляю изменения, а затем располагаю DataContext.

...