У меня возникают проблемы при попытке сохранить сущности, имеющие отношения родитель / потомок в EF4.Иногда дочерний элемент будет вставлен перед родителем, что, очевидно, вызовет проблемы с точки зрения ограничения ссылок.Две таблицы структурированы следующим образом:
OrderHeader
- OrderID (PK)
OrderDetails
- OrderID (PK)
- DetailID (PK)
(есть больше столбцов, но они не имеют значения).
Примечание: Мы не разоблачаемистинный внешний ключ для OrderDetails.OrderID, но вместо этого мы используем триггеры, чтобы обеспечить наличие идентификатора OrderID таблицы Details в таблице Header.Разоблачение FK может быть быстрым решением, но в нашем приложении такие изменения в базе данных не допускаются - нам приходится иметь дело с унаследованным кодом и т. Д.
Просмотр XML в .edmxФайл, который создает дизайнер, я заметил, что он создает AssociationSet и Association в Концептуальной модели (раздел CSDL) - и Association настроен с ReferentialConstraint.Однако, это не делает AssociateSet или Ассоциацию в разделе SSDL.Похоже, что они добавляются только тогда, когда FK выставляется в базе данных.Для других баз данных, которые я тестировал (например, AdventureWorks или Northwind), в которых есть истинные FK в базе данных, при создании модели из базы данных я вижу, что EDMX включает в себя разделы Association и AssociationSet в SSDL.
Похоже, что EF игнорирует ассоциацию, которую мы имеем в модели (CSDL), и вместо этого просто вставляет в алфавитном порядке по имени таблицы - так что в этом случае нам не повезло, так как OrderDetail сортирует перед OrderHeader (а у нас, конечно, нетвозможность переименовывать таблицы в нашем случае).Если я вручную добавлю соответствующий AssociationSet и Association в разделе SSDL, сохранение произойдет в правильном порядке (сначала вставьте заголовок, затем вставьте Detail).Тем не менее, каждый раз, когда мы делаем «Обновление модели из базы данных», эти ручные изменения исчезают, поэтому это не очень практичное решение.Я думал о том, чтобы попытаться выполнить это исправление динамически во время выполнения, но кажется, что это много усилий, чтобы обойти что-то, что должно «просто работать».
Я надеюсь, что есть способчто EF может уважать Ссылочное ограничение и / или Ассоциацию, которые определены в CSDL, когда он заказывает Вставки.