Сущность тянет за тонну таблиц не в моем запросе - PullRequest
0 голосов
/ 15 ноября 2011

В нашей схеме есть таблица, которая нормализует данные, мы называем ее DataPart.Грубо говоря, его определение:

DataPart
--------
DataPartId   int
Message      varchar(200)
CreatedDate  datetime

POCO соответствует этому:

public class DataPart {
    public long DataPartId {get; set;}
    public string Message {get; set;}
    public DateTime CreatedDate {get; set;}

    public virtual ICollection<Album> Albums {get; set;}
    public virtual ICollection<Comment> Comments {get; set;}
    public virtual ICollection<Post> Posts {get; set;}
    // and so on...
}

Поскольку существуют свойства навигации (Альбом, Комментарий, Публикация всех используют DataPart), мы должны были настроитьсвойства первичного ключа и сопоставления ключей с помощью построителя модели:

modelBuilder
    .Entity<DataPart> ()
    .HasOptional (x => x.Album)
    .WithOptionalPrincipal (x => x.DataPart);

modelBuilder
    .Entity<DataPart> ()
    .HasOptional (x => x.Comment)
    .WithOptionalPrincipal (x => x.DataPart);

modelBuilder
    .Entity<DataPart> ()
    .HasOptional (x => x.Post)
    .WithOptionalPrincipal (x => x.DataPart);

// and so on...

Я написал следующий запрос LINQ-to-Entities:

var query =
    from DataPart dp in db.DataParts
    where dp.CreationDate >= dateFrom && dp.CreationDate <= dateTo;

LINQPad показывает, что он выполняет LEFT OUTER JOIN противвсе таблицы настроены как свойства навигации, хотя ни одна из них на самом деле не используется этим запросом!

Я думаю, что моя проблема - это раздел modelBuilder, но я не уверен, что ясделали неправильноКаждый альбом / комментарий / публикация должны иметь DataPart, но DataPart будет иметь отношение только к одному из 20 с лишним типов объектов.Я сделал .WithRequired, и результат тот же.

edit: Проблема исчезнет, ​​если я на самом деле выберу необходимую информацию.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2011

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

Почему вы пытаетесь отобразить отношение один к одному, когда ваш фрагмент класса DataPart не ожидает этого? Ваше текущее отображение не совместимо с классом, который вы показали.

0 голосов
/ 15 ноября 2011

«HasOptional» просто утверждает, что ваша DataPart может иметь 0 или более связанных элементов Album / Comment / Post (и что внешний ключ может быть нулевым), следовательно, левое внешнее соединение (что эквивалентно «вернуть все DataParts плюс0 или более элементов объединенной таблицы ")

Ваш запрос LINQ возвращает объекты DataPart.Эти объекты имеют свойства навигации, указывающие на таблицы, которые вы видите в выполненном запросе БД.Либо данные для этих навигационных свойств необходимо загружать с нетерпением в начальном запросе базы данных, либо загружать с отложенной загрузкой при первом обращении к свойствам (или загружать вручную - подробности загрузки см. В http://msdn.microsoft.com/en-us/library/bb896272.aspx).1006 * Если вы не хотите, чтобы они отображались в исходном запросе базы данных, включите отложенную загрузку для этих свойств навигации.

...