В нашей схеме есть таблица, которая нормализует данные, мы называем ее 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: Проблема исчезнет, если я на самом деле выберу необходимую информацию.