14

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

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

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

ответ

9

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

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

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

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

+0

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

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