Entity Framework с интерфейсами не работает - какой лучший способ справиться с этим?

Я использую Entity Framework и хотел бы использовать TPH с интерфейсами. Поэтому у меня есть созданный интерфейс "ICustomer", который сопоставляется с классом "SimpleCustomer" и "DiscountedCustomer", как показано ниже. Ниже приведен код построителя модели. Насколько я понимаю, мы не можем использовать интерфейсы с Entity Framework, так что лучший способ?

 modelBuilder.Entity<ICustomer>().ToTable("tblCustomer")
.Map<SimpleCustomer>(x => x.Requires("CustomerType").HasValue("S"))
.Map<DiscountedCustomer>(x => x.Requires("CustomerType").HasValue("D"));

Мое приложение использует интерфейсы по всему пользовательскому интерфейсу и хочет иметь плавное литье типов в Entity Framework. Так что лучший способ?

Ответы

Ответ 1

Entity Framework не поддерживает TPH с интерфейсами (извините за указание очевидного). Возможно, это не решение, которое вы ищете, но я все еще собираюсь его поместить, потому что это единственное решение по состоянию на 16 апреля 2015 года.

В Entity Framework 6 самое близкое, что вы можете получить, - Использовать абстрактные классы вместо интерфейсов. Эта статья подробно рассказывает о TPH в EF.

Мое предложение состоит в том, что вы хотите использовать интерфейсы и поддерживать иерархию, а также по-прежнему хотите гладкое приведение типов, рассмотреть возможность использования automapper с абстрактными классами.. Таким образом, ваш пользовательский интерфейс будет по-прежнему использовать интерфейсы, но может быть сопоставлен с моделью домена с использованием профилей automapper. По крайней мере, пока не появится поддержка интерфейса. Это не будет быстрым, если приложение велико и имеет сотни доменных моделей, поэтому нужно планировать его с умом.

Если вы создаете его с нуля, вы можете просто использовать абстрактные классы из слоя пользовательского интерфейса в DAL без какого-либо повторного факторинга.