EF6 Code First: Entity с несколькими отношениями

.net c# entity-framework entity-framework-6 vb.net

Вопрос

Я создаю новую базу данных, используя первый код EF, который содержит следующие классы:

Address, Contact, Account, Customer (a sub-class of Account), and SalesOrder. 

Класс Address - это тот, который дает мне проблемы на данный момент, он не может иметь никакого внешнего ключа, потому что он может быть связан с любым из пяти других классов (с еще большим числом), и каждый из других классов может иметь одну или несколько навигаций свойства, возвращающиеся к нему.

Свойства навигации должны выглядеть следующим образом:

Address, Contact, Account, Customer (a sub-class of Account), and SalesOrder. 

Для этих классов должна быть возможность использовать одну и ту же запись адреса, например, Учетная запись имеет адрес, это также может быть связано с SalesOrder, другой адрес, связанный с Клиентом, может быть связан с другим SalesOrder. Все Адреса, связанные с Аккаунтами и Клиентами, должны быть уникальными, но другие классы должны иметь возможность обмениваться ссылками с этими Адресами.

Я попытался настроить его со всеми возможными свободными конфигурациями, о которых я могу думать, с моим DbContext, имеющим свойство DbSet и без него (в конечном счете, я не думаю, что он должен иметь собственное свойство DbSet, поскольку Адреса должны быть доступны только из различные корневые объекты, но если это единственный способ заставить его работать, я с удовольствием управляю вставками / удаляет себя).

Я попытался сделать все свойства навигации нулевыми (в идеале SalesOrder.InvoiceAddressId не должен быть нулевым), а также должен был удалить отображение Customer.DeliveryAddresses Many-to-Many в какой-то момент, потому что это путало проблему.

Я получаю различные ошибки в зависимости от того, как я это настроил, либо конфликты множественности из-за полей, которые не являются нулевыми, либо ошибки Cascade on Delete, когда у меня нет свойства DbSet, и я пытаюсь разрешить EF обрабатывать вставки и удалять.

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

Address, Contact, Account, Customer (a sub-class of Account), and SalesOrder. 

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

Единственное, что я могу думать о том, что я не пробовал, - это создать несколько подклассов Address и использовать их со своим родственным классом (например, SalesOrderDeliveryAddress), но это не кажется идеальным. Я бы предпочел не делать этого, если только не должен.

Является ли то, что я ищу в EF, или есть ли другой способ сделать это?

Спасибо, Дэвид

Популярные ответы

Есть несколько вопросов, которые делают это запутанным. Для начала я отключил каскад по умолчанию для удаления, чтобы избавиться от нескольких каскадных путей и вернуться к этому позже.

Затем читайте о добавлении отключенных деревьев, внешних ключей и свойств навигации здесь: http://msdn.microsoft.com/en-us/magazine/dn166926.aspx

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

После того, как вы добавили и обновили работу, вы можете вернуться и работать там, где вы можете поместить каскадное удаление, и где он должен быть ручным




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему