Код Первая таблица для каждого сопоставления иерархии ⇐ C#
-
Anonymous
Код Первая таблица для каждого сопоставления иерархии
У меня есть сущность Организация, которая представляет компании, которые могут быть поставщиком, клиентом или и тем, и другим.
Эта сущность выглядит следующим образом:
Организация публичного абстрактного класса { общественная организация() { IsCustomer = ложь; IsSupplier = ложь; } общественный ИНТ Id {получить; набор; } общедоступная строка Имя {get; набор; } общественный bool IsSupplier {получить; набор; } общественный bool IsCustomer {получить; набор; } } Я создал подклассы организации под названием Клиент и Поставщик, так как это облегчит работу с Организациями в других частях мой домен (например, с заказом на покупку может быть связана только Организация, которая является Поставщиком).
Я создал два класса, производные от класса Organization.
Общественный класс Поставщик: Организация { } общественный класс Заказчик: Организация { } Далее я хочу рассказать Entity Framework, как сопоставить эти классы с таблицей. Вся информация будет храниться в одной таблице под названием «Организации», поэтому я пытаюсь использовать сопоставление TPH (таблица на иерархию).
Вот как я хочу, чтобы мое сопоставление работало:
[*]Если я запрашиваю Организации, я хочу, чтобы Entity Framework возвращала все организации независимо от значений в свойствах IsCustomer и IsSupplier. ли> [*]Если я запрашиваю Поставщиков, я хочу, чтобы Entity Framework возвращала все организации, где IsSupplier = true. [*]Если я запрашиваю Клиенты, я хочу, чтобы Entity Framework возвращала все организации, где IsCustomer = true.
Организация может быть одновременно и клиентом, и поставщиком, поэтому я ожидаю, что некоторые организации будут включены как в запросы Клиент, так и в Поставщик.
>
Вот класс конфигурации, который я определил:
class OrganizationConfiguration: EntityTypeConfiguration { внутренняя конфигурация организации() { ToTable("Организации"); HasKey(o => o.Id); Карта(m => { m.Requires("IsCustomer").HasValue(true); }); Карта(m => { m.Requires("IsSupplier").HasValue(true); }); } } Это приводит к возникновению DataException со следующим сообщением:
ошибка 3032: Проблема с сопоставлением фрагментов, начиная со строки 59: Условие член «Организация.IsSupplier» с условием, отличным от Сопоставляется IsNull=False. Либо удалите условие on Organization.IsSupplier или удалите его из сопоставления.
Я не уверен, как исправить эту ошибку, и вообще возможно ли то, что я хочу сделать, поскольку все примеры, которые я видел, имеют один столбец дискриминатора. Я не уверен, что смогу достичь желаемого результата с помощью одного дискриминатора, поскольку мне нужно будет различать организации, которые являются одновременно клиентами и поставщиками.
Обновление:
После некоторых исследований выяснилось, что ошибка связана с тем, что у меня есть свойства IsSupplier и IsCustomer, определенные в моем классе Organization. Если я удалю эти свойства, моя база данных будет построена правильно, и мое сопоставление будет работать (Entity Framework создает отдельные дискриминаторы в моей таблице).
Я проверил это с помощью трех отдельных запросов (1 для выбора Организации, 1 для выбора Клиентов и 1 для выбора Поставщиков), и это Кажется, я получил правильные результаты, так что это помогло мне примерно на 90% пути к моему решению.
Проблема, с которой я столкнулся сейчас, заключается в том, что мне нужен способ выбрать Клиент из базы данных, а также установить его в качестве поставщика (поскольку у меня нет свойства для установки).
У меня есть сущность Организация, которая представляет компании, которые могут быть поставщиком, клиентом или и тем, и другим.
Эта сущность выглядит следующим образом:
Организация публичного абстрактного класса { общественная организация() { IsCustomer = ложь; IsSupplier = ложь; } общественный ИНТ Id {получить; набор; } общедоступная строка Имя {get; набор; } общественный bool IsSupplier {получить; набор; } общественный bool IsCustomer {получить; набор; } } Я создал подклассы организации под названием Клиент и Поставщик, так как это облегчит работу с Организациями в других частях мой домен (например, с заказом на покупку может быть связана только Организация, которая является Поставщиком).
Я создал два класса, производные от класса Organization.
Общественный класс Поставщик: Организация { } общественный класс Заказчик: Организация { } Далее я хочу рассказать Entity Framework, как сопоставить эти классы с таблицей. Вся информация будет храниться в одной таблице под названием «Организации», поэтому я пытаюсь использовать сопоставление TPH (таблица на иерархию).
Вот как я хочу, чтобы мое сопоставление работало:
[*]Если я запрашиваю Организации, я хочу, чтобы Entity Framework возвращала все организации независимо от значений в свойствах IsCustomer и IsSupplier. ли> [*]Если я запрашиваю Поставщиков, я хочу, чтобы Entity Framework возвращала все организации, где IsSupplier = true. [*]Если я запрашиваю Клиенты, я хочу, чтобы Entity Framework возвращала все организации, где IsCustomer = true.
Организация может быть одновременно и клиентом, и поставщиком, поэтому я ожидаю, что некоторые организации будут включены как в запросы Клиент, так и в Поставщик.
>
Вот класс конфигурации, который я определил:
class OrganizationConfiguration: EntityTypeConfiguration { внутренняя конфигурация организации() { ToTable("Организации"); HasKey(o => o.Id); Карта(m => { m.Requires("IsCustomer").HasValue(true); }); Карта(m => { m.Requires("IsSupplier").HasValue(true); }); } } Это приводит к возникновению DataException со следующим сообщением:
ошибка 3032: Проблема с сопоставлением фрагментов, начиная со строки 59: Условие член «Организация.IsSupplier» с условием, отличным от Сопоставляется IsNull=False. Либо удалите условие on Organization.IsSupplier или удалите его из сопоставления.
Я не уверен, как исправить эту ошибку, и вообще возможно ли то, что я хочу сделать, поскольку все примеры, которые я видел, имеют один столбец дискриминатора. Я не уверен, что смогу достичь желаемого результата с помощью одного дискриминатора, поскольку мне нужно будет различать организации, которые являются одновременно клиентами и поставщиками.
Обновление:
После некоторых исследований выяснилось, что ошибка связана с тем, что у меня есть свойства IsSupplier и IsCustomer, определенные в моем классе Organization. Если я удалю эти свойства, моя база данных будет построена правильно, и мое сопоставление будет работать (Entity Framework создает отдельные дискриминаторы в моей таблице).
Я проверил это с помощью трех отдельных запросов (1 для выбора Организации, 1 для выбора Клиентов и 1 для выбора Поставщиков), и это Кажется, я получил правильные результаты, так что это помогло мне примерно на 90% пути к моему решению.
Проблема, с которой я столкнулся сейчас, заключается в том, что мне нужен способ выбрать Клиент из базы данных, а также установить его в качестве поставщика (поскольку у меня нет свойства для установки).
Мобильная версия