Entity Framework и моделирование коллекций с интерфейсом в качестве возвращаемого типа - PullRequest
6 голосов
/ 07 апреля 2010

Я использую Entity Framework v4. Я создал класс POCO, который содержит кучу скалярных свойств и коллекцию, которая возвращает тип интерфейса. Как мне создать эти отношения в модели EF? Как показать коллекцию, которая содержит разные элементы, но у всех них есть общий интерфейс? Вот пример того, чего я пытаюсь достичь.

interface IPatientDocument{}
public class Lab : IPatientDocument{.....}
public class Encounter : IPatientDocument{...}
public class MedicationLog : IPatientDocument{...}

//Incomplete class listing
//Once I have aggregated the different doc types, I can then use Linq to Obj to retrieve the specific doc type I need.  Currently I have about 26 doc types and do not want to create a collection for each one
public class Patient
{
   IList<IPatientDocument> DocumentCollection;
}

Ответы [ 2 ]

3 голосов
/ 01 июля 2010

Будьте очень очень осторожны, если вы используете наследование TPT (Table-Per-Type) с Entity Framework. Особенно , если у вас 26 типов документов. Я написал в блоге о генерации неработающего SQL для наследования TPT, а также открыл ошибку в Microsoft Connect . MS призналась в проблеме, и они говорят, что работают над этим, но не задерживают дыхание. Им потребовалось 3 месяца, чтобы осознать проблему, и все, что они сказали, было: «Мы знаем о проблемах производительности с иерархиями TPT. В настоящее время мы исследуем решения и ожидаем улучшения в этой области в будущем выпуске».

С 26 типами документов, даже с базовым запросом, EF потребуется около 2 минут, чтобы сгенерировать SQL (который будет около 8000 строк), и SQL Server, чтобы обработать его. Вы будете на 30 уровней в нелепых подзапросах. Избегайте наследования TPT любой ценой. Если вы только запускаете приложение, кажется, что оно работает, потому что у вас обычно есть только несколько подтипов, но как только вы добавите больше, ваше приложение замедлится до сканирования.

0 голосов
/ 25 апреля 2010

Я не знаю, полностью ли это законно. Если бы вы могли реализовать с использованием базового класса, вы бы, вероятно, делали таблицу для каждого типа наследования, что разрешено. Но если вы просто пытаетесь выбрать произвольные типы, вы попадаете в ко- и противоположную дисперсию, которую, возможно, стоит исследовать, поскольку она нова в .NET 4.

...