Используйте производный класс вместо абстрактного типа в Entity Framework - PullRequest
2 голосов
/ 11 сентября 2011

У меня есть объект ThirdParty и два производных объекта: поставщик и клиент.
У меня есть другая организация под названием «Работник», членом которой является Поставщик:

public abstract class ThirdParty { }
public class Supplier : ThirdParty { }
public class Customer : ThirdParty { }

public class Worker {
    public virtual string Name {get;set;}
    public virtual Supplier Supplier {get;set;}
}

Когда я получаю Worker из базы данных, используя платформу сущностей, я получаю следующее исключение:

Для указанного типа сущности 'CompanyData.Supplier' не определено никаких EntitySets. Если «CompanyData.Supplier» является производным типом, используйте базовый тип.

Ошибка заставляет меня использовать тип ThirdParty вместо типа поставщика для члена поставщика. Но я хочу, чтобы поставщик был с типом поставщика, а не с третьей стороной. Как я могу это исправить?

Ответы [ 2 ]

2 голосов
/ 11 сентября 2011

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

Надеюсь, это поможет.

1 голос
/ 11 сентября 2011

Похоже, вам нужно добавить определение Таблица на иерархию (TPH) в определение вашей модели сущности. (Храните все данные для производных типов в одной таблице)

Вот несколько ссылок, которые могут помочь вам настроить это:

Пошаговое руководство. Отображение наследования - таблица на иерархию (инструменты модели данных объекта)

Как: определить модель с наследованием таблиц на иерархию

Как выбрать стратегию наследования

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