2009-06-08 2 views
1

Я построил модель Entity Framework (v1), который включает в себя наследование, как это:Linq к Entities

Базовый класс: Выпуск

< - Жалоба

< - CustomerQuery и т. Д. (6 производных классов)

Эти классы сопоставляются с соответствующими таблицами в SQL Server.

Я был впечатлен тем, как я мог использовать LINQ для объектов для создания - EF подсчитывает, что он должен помещать некоторые данные в одну таблицу, получать значение ключа идентификации и использовать его в другой таблице.

НО: Когда я сделать простой запрос, например, следующий

var result = dataContext.IssueSet.Where(x => x.Id == id); 

... ToTraceString показывает SQL кода более 1000 строк длинные! И он делает это.

Считаете ли вы вероятным, что я сделал что-то не так в своей модели или является огромным кодом SQL, характерным для структур наследования в L2E?

P.S. Вот начало следа строки SQL для информации:

SELECT 
1 AS [C1], 
CASE WHEN ((NOT (([UnionAll8].[C45] = 1) AND ([UnionAll8].[C45] IS NOT NULL))) 
AND (NOT (([UnionAll8].[C46] = 1) AND ([UnionAll8].[C46] IS NOT NULL))) 
AND (NOT (([UnionAll8].[C47] = 1) AND ([UnionAll8].[C47] IS NOT NULL))) 
AND (NOT (([UnionAll8].[C48] = 1) AND ([UnionAll8].[C48] IS NOT NULL))) 
AND (NOT (([UnionAll8].[C49] = 1) AND ([UnionAll8].[C49] IS NOT NULL))) 
AND (NOT (([UnionAll8].[C50] = 1) AND ([UnionAll8].[C50] IS NOT NULL))) 
AND (NOT (([UnionAll8].[C51] = 1) AND ([UnionAll8].[C51] IS NOT NULL))) 
AND (NOT 
+0

Я думаю, что вы, вероятно, сделали что-то странное в своей настройке EF - я давно использовал EF и никогда не испытывал таких проблем. –

+0

Меня не поощряют после прочтения этого: http://social.msdn.microsoft.com/Форумы/en-US/adodotnetentityframework/thread/e412859c-4c85-4769-8c14-96bd0f3e022b (некоторые люди, которые в итоге имеют 10k строк SQL и не имеют никакого решения) – Martin

ответ

1

Я не думаю, что запрос просто на всех. Подумайте, что вы просите фреймворк на самом деле: материализуйте объект, который может быть одним из шести разных типов. Фактически, вы, вероятно, знаете, какой тип сущности вы пытаетесь материализоваться; вы просто не указали эту информацию в фреймворк.

Так, некоторые мысли:

  • При выборе объектов одного типа из набора сущностей, который включает в себя несколько типов, использования OfType сообщить рамки, что вы не намерены материализовать любые другие типы ,
  • Рассмотрите возможность использования таблицы для каждой иерархии, а не таблицы для моделей типов, особенно если большинство подтипов имеют много общих полей.
  • В рамках ограничений хорошего OOD не используйте чрезмерное использование наследования. Я нахожу, что многие люди склонны использовать наследование для проблем, которые лучше решаются композицией, с или без Entity Framework.
  • Будьте осторожны с тем, чтобы списать структуру Entity Framework просто потому, что у вас возникла проблема при первой попытке использовать ее в том, что вы читали что-то на доске объявлений, что дало вам паузу. Рамка сложна, она работает по-другому, чем многие люди ожидают, но она хорошо работает, когда вы ее понимаете. Ваша первая попытка использовать его, вероятно, будет неправильной. Придерживайтесь этого и узнайте, как работает каркас.
+0

Использование OfType создает аналогичный запрос (1000+ строк). TPH всерьез непривлекателен - нарушает практику данных, которые я придумал. Мы используем реляционные базы данных/нормализацию по какой-либо причине - ОРМ не должна заставлять нас отказаться от передовой практики. Даже простой случай наследования, похоже, приводит к тому же шаблону генерации SQL, поэтому я не могу понять, как его можно в настоящее время использовать в любом реальном сценарии. Я очень стараюсь придерживаться L2E, но в случае запросов наследования они были вынуждены вернуться к сохраненным процессам (с расширениями EF), чего я действительно надеялся избежать. – Martin

+0

Будьте осторожны, говоря себе, что «платформа Entity Framework работает именно так». Это повод избежать решения проблемы. Мы используем наследование в наших сущностных моделях (хотя, из-за его звуков, должно быть так, как вы, я считаю это менее необходимым для объектов с ценностями, чем для типов с поведением), как для каждой таблицы по иерархии, так и для таблицы для каждого типа, и мы не см. 1000 строк SQL в запросах. Поэтому в вашем сценарии что-то не так. Я бы предложил начать с более простой модели и построить ее до модели, в которой вы хотите получить кусок за раз, чтобы узнать, в чем проблема. –

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