2

Хорошо, очевидно, я сражаюсь .net здесь ... и ответ, вероятно, заключается в том, что я лаяю неправильное дерево и должен просто заниматься только тем, что использовал дизайн базы данных, я бы 5 лет тому назад.Entity Framework: множественное наследование

Я хочу иметь абстрактный объект Клиент и иметь 2 унаследованных объекта Поставщик и клиент.

Отношения между клиентом и поставщиком как и клиент 1: 0/1

Это, вероятно, означает, что решение, основанное на наследство будет работать хорошо, как это позволило бы мне писать меньше кода проверки, а также рычаг строго типизированные коллекции.

Однако из рамки сущности объекта настаивает на использовании уникального идентификатора в таблице клиентов и отказе предоставить вам тот же идентификатор, что и ссылки из таблиц Заказчика и поставщика.

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

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

Это приводит к разработке вопроса о том, как наилучшим образом смоделировать этот сценарий ... Я рискую сделать условное объединение и логические поля для «isCustomer», «isSupplier» или таблицы поставщиков и клиентов, которая объединяет к клиенту и писать код для поддержания отношения 0-1 с ним.

У кого-то еще должно быть такого рода проблемы? Нет элегантных решений?

a alternative: Мне нужно несколько видов одного и того же объекта. Это означает, что я не могу просто иметь целочисленное значение в одном поле, определяющее, какие представления разрешены. Мне нужно использовать несколько полей bool, чтобы определить, какие виды объектов разрешены.

Возможно ли это в EF? Очевидно, что я могу создавать представления в БД, но вместо этого я делаю это из EF и создаю SQL. (хотя я уже определяю sp для настройки различных ключей и ограничений в db, но это означает, что я все больше и больше предпочитаю отказаться от использования EF для генерации моей схемы)

ответ

1

К сожалению, все, что вы просите, на самом деле невозможно. .NET не допускает множественного наследования, поэтому это не является (и не будет) функцией EF или любого другого ORM.

Вам нужно будет удалить наследование в дизайнере EF и просто разрешить нормальную связь между таблицами 1: 1 *.

Вы будете в конечном итоге с проектирования баз данных, которую вы ищете, и ваш C# синтаксис будет выглядеть следующим образом:

Client c; 

c.Customer.[...] 
c.Supplier.[...] 
+0

idd, к сожалению, это заключение, к которому я прихожу ... это самый простой, с которым я пришел. По крайней мере ORM управляет 1: 0/1. Просто показывает, что старый адъютант предпочитает ассоциировать над наследованием еще раз правила (до сих пор) –

0

Положите все, что является общим для клиентов и поставщиков в клиент, и только материал, характерный для клиентов в клиенте, характерный для поставщиков в поставщике.

3 таблицы, 3 типа объектов.

+0

Thankyou, это то, что я сделал, но это не позволит мне иметь один клиент, который * и * поставщик и клиент. –

+0

О, я понимаю, о чем вы говорите. может быть, есть таблица со всеми полями клиентов и поставщиков? – Beth

+0

Да, это один из вариантов ... но мне не нравится, так как я мог нормализовать поля поставщика и клиента в отдельные таблицы - оставляя клиента с поставщиками и клиентом и применяя уникальный ключ в обоих столбцах. (im the pain the ass;), но спасибо) –

0

Я знаю эту должность, если 5 лет по ФВ до сих пор не исправил ...

Возможно, мне что-то не хватает, но EF не позволит нескольким детям наследовать от одного родителя, и DotNet вполне способен на это. Я могу обойти это, изменив каждый объект на частичный класс и затем определяя интерфейс, который реализует каждый частичный класс. Это нелепо. Каждая таблица в нашей базе данных имеет 4 столбца: CreatedBy, CreatedOn, UpdateBy, UpdateOn. Если я создам абстрактный класс в структуре сущности, я должен унаследовать каждый объект из этого одного абстрактного класса, чтобы каждый объект имел эти четыре поля. Но вы не можете. Только одна таблица может наследовать от абстрактного класса. Это не имеет никакого смысла. Он полностью побеждает цель абстрактного класса. Я хочу, чтобы каждая сущность приходила с этими четырьмя полями, но только один ребенок мог их иметь. Корпорация должна иметь эти четыре поля. У учреждений, дочерних компаний корпорации, также должны быть эти четыре поля. Но нет, не может этого сделать. Несмотря на то, TimeStampTable является абстрактным классом только один стол может наследовать и только одна таблица получает четыре поля

Вот диаграмма Entity

enter image description here

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

вы должны реализовать этот интерфейс вручную в каждом файле частичного класса.

удачи (или найти другой ORM)

Смежные вопросы