LINQ to SQL: удалить новую добавленную дочернюю сущность до отправки изменений - не удалось - PullRequest
2 голосов
/ 28 мая 2009

У меня есть родительские дочерние отношения, очень похожие на Northwind Customer / Orders, но с одним отличием, CustomerID в таблице Orders не может принимать NULL, это FK, у дочернего элемента есть один столбец PKey с именем OrderID

Я использую эту модель в привязке данных форм Windows, в верхней области указана информация о клиенте в текстовых полях, в нижней области - сетка с перечисленными заказами

Я извлекаю клиента, используя LINQ из БД, чтобы позволить пользователю редактировать информацию о клиенте или детали заказа, когда я удаляю строку из сетки заказов, затем отправляю изменения, я получаю ошибку «Была предпринята попытка удалить отношение между клиентом и заказами, однако для одного из внешних ключей отношения (CustomerID) не может быть установлено значение Null»

после долгого поиска в интернете я использовал атрибут DeleteOnNull = True, и теперь он работает

Что не работает, но все равно выдает ту же самую ошибку, когда я добавляю новый порядок в сетку, а затем удаляю его перед SubmitChanges

Я понимаю, что когда я удаляю новую строку заказа в сетке, я только удаляю связь с клиентом, поэтому он устанавливает CustomerID = NULL для этой сущности, хорошо, теперь, как полностью удалить его из набора сущностей перед отправкой изменений чтобы избежать ошибки, я не могу использовать DeleteOnSubmit, потому что это новая сущность, не пришедшая из db, я получу исключение, если попробую, поэтому удаление строки вручную с использованием сетки не работает, что вызывает метод «Удалить» я думаю, и я не могу использовать DeleteOnSubmit, что я могу сделать?

почему это должно быть так сложно? в ADO.NET datatable намного проще, если я удаляю строку, и она случайно приходит из db, то помечает ее для удаления, если это новая строка, то она удаляет ее из коллекции, Готово! я не хочу возвращаться к наборам данных, вложив много усилий в изучение LINQ to SQL сейчас

любая помощь очень ценится

Спасибо Bassam

1 Ответ

2 голосов
/ 29 июня 2009

Я обнаружил, в чем проблема, и решил ее. Я хочу поделиться информацией здесь, если у кого-то есть такая же проблема

Сначала я хочу упомянуть важный факт: если в БД включено каскадное удаление, то

DeleteOnNull:=True , DeleteRule:="CASCADE"  

будет автоматически вставлено в код за файлом .dbml без необходимости вручную добавлять DeleteOnNull=True для конкретной ассоциации.

Проблема в том, что в дочерней сущности был FKey для OrderType, то есть OrderTypeID. Я установил это значение так:

Dim NormalOrderType = (From ot in db.OrderTypes Where ot.OrderTypeID=1 Select ot).Single
NewOrder.OrderType = NormalOrderType          
OrdersBindingSource.Add(NewOrder)       

Когда пользователь удаляет заказ из таблицы для определенного клиента, LINQ to SQL устанавливает для CustomerID FKey значение НИЧЕГО, нарушая связь с родительской сущностью. НО, он не устанавливает OrderTypeID на НИЧЕГО, сохраняя активную другую ассоциацию на OrderTypes сущность. С сущностью OrderType, уже загруженной в память, LINQ to SQL будет думать, что я все еще хочу вставить дочернюю сущность, но с CustomerID=Nothing, и поскольку это запрещено (как в файле dbml, Nullable=False), оно вызовет исключение, прежде чем попытаться сохранить в БД.

Эта проблема решается следующим образом:

NewOrder.OrderType = NOTHING

Это вручную удаляет связь для другого FKey. Затем простое удаление дочерней сущности приведет к тому, что LINQ to SQL будет игнорировать ее при вызове submitChanges.

Спасибо
Бассам Мухаммед.

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