Таблица Entity Framework 4.2 для каждой иерархической группы по дискриминатору - PullRequest
5 голосов
/ 08 декабря 2011

Я работаю над проектом, используя первую модель кода EF 4.2.Эта модель содержит структуру наследования TPH для продуктов.Мне нужно сгруппировать полиморфные результаты этой модели наследования по дискриминатору, и я сталкиваюсь с некоторыми проблемами.

Структура сущностей не предоставляет дискриминатор для завершения этой группировки.Мой первый вопрос: могу ли я получить прямой доступ к этому дискриминатору?Мое чтение и опыт говорят мне «нет», поэтому я пришел к такому решению, которое работает.Это не очень хорошо, и я не доволен тем, как его нужно поддерживать.

Мои классы выглядят примерно так (упрощенно):

Public MustInherit Class Product
      <key()>  
      Public Property ProductID as integer

      <StringLength(50, ErrorMessage:="Max 50 characters")>
      <Required(ErrorMessage:="Product name is required")>
      Public Property Name as String

      <TimeStamp()>
      Public Property Time_Stamp as DateTime = DateTime.Now()
End Class

Public Class Desktop
      Inherits Product

      <StringLength(50, ErrorMessage:="Max 50 characters")>
      <Required(ErrorMessage:="Processor is required")>
      Public Property Processor as String
End Class

Public Class Monitor
      Inherits Product

      <Required(ErrorMessage:="Monitor size is required")>
      Public Property Size_Inches as Integer
End Class

Я создал метод расширения, которыйберет продукт и возвращает его имя базового типа в виде строки.

<Extension()>
Public Function ProductType(ByVal inProduct as Product) as String
      ProductType = inProduct.GetType().BaseType.Name
End Function

После этого я построил эту структуру, чтобы сгруппировать результаты продукта по типу, чтобы я мог просмотреть их:

Dim tmpProducts = db.Products.ToList()
Dim GrpProducts = tmpProducts.GroupBy(Function(prod) prod.ProductType) _
                             .Select(Function(s) New With {.ProductType = S.Key,
                                                           .Products = S })

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

For Each ProductGroup in GrpProducts
       Dim TypeName as String = ProductGroup.ProductType
       Dim TypeProducts = ProductGroup.Products
Next

Кроме того, это можетпредоставьте мне легкий доступ к общим свойствам (Имя), но теперь у меня нет много вариантов для преобразования их в их реальный тип, возможно, случай выбора вокруг TypeName.,.

Любые рекомендации приветствуются, также, пожалуйста, простите за любые ошибки кода выше, я набрал примеры из памяти, так как в данный момент у меня нет доступа к проекту.

Ответы [ 2 ]

2 голосов
/ 18 июня 2012

Решение состоит в том, чтобы смоделировать немного больше и получить новую сущность ProductType, имеющую свойство Name.Тогда у вас будут простые 1-N отношения между Product и ProductType.Я не использовал EntityFramework, но с помощью NHibernate вы могли бы легко заставить фреймворк всегда присоединяться к этой таблице при запросах, чтобы он не возвращал прокси для ProductType для каждого Product, что могло бы снизить производительность.

В качестве дополнения в будущем ProductType может развить другие интересные свойства (например, значения, общие для каждого Product этого ProductType), поэтому оно добавляет гибкости вашему решению, хотяу него есть немедленная стоимость добавления другой таблицы в вашу базу данных.

1 голос
/ 12 октября 2016

Следующий запрос Linq должен дать вам способ решить группу по дискриминатору

from a in db.Records
group a.ID by new
{
    Name= a is Audio ? "Audio" :
            a is Video ? "Video" :
            a is Picture ? "Picture" :
            a is Document ? "Document" : "File"
} into g
select new 
{
    Name = g.Key.Name,
    Total = g.Count()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...