C# 实体拉入大量不在我的查询中的表
我们的模式中有一个表规范化数据,我们称之为DataPart。大致上,它的定义是:C# 实体拉入大量不在我的查询中的表,c#,entity-framework-4.1,ef-code-first,C#,Entity Framework 4.1,Ef Code First,我们的模式中有一个表规范化数据,我们称之为DataPart。大致上,它的定义是: DataPart -------- DataPartId int Message varchar(200) CreatedDate datetime POCO与此匹配: public class DataPart { public long DataPartId {get; set;} public string Message {get; set;} public Dat
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...
}
由于有导航属性Album、Comment、Post都使用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到实体查询:
var query =
from DataPart dp in db.DataParts
where dp.CreationDate >= dateFrom && dp.CreationDate <= dateTo;
LINQPad显示了它对所有设置为导航属性的表执行左外部联接,即使这些表中没有一个实际使用此查询拉入
我认为我的问题是modelBuilder节,但我不确定我做错了什么。每个相册/评论/帖子都需要一个DataPart,但DataPart只与20种奇怪类型的对象中的一种相关。我已经做了。按要求,结果是一样的
编辑:如果我真的选择了我需要的信息,问题就消失了。haspoptional只声明您的DataPart可以有0个或更多相关的Album/Comment/Post项,并且外键可以为空,因此左外联接相当于返回所有DataPart加上0个或更多联接的表项 LINQ查询返回DataPart对象。这些对象具有指向您在执行的db查询中看到的表的导航属性。这些导航属性的数据需要在初始db查询中立即加载,或者在第一次访问或手动加载属性时延迟加载-有关加载详细信息,请参阅
如果不希望它们显示在初始db查询中,请为这些导航属性启用延迟加载。这就是EF在配置一对一关系时的行为方式。当您查询主体实体时,它将加入所有可选的一对一依赖项,以了解它们是否存在 当DataPart类的片段不期望映射一对一关系时,为什么要尝试映射它?当前映射与显示的类不兼容。LazyLoading已启用:db.Configuration.LazyLoadingEnabled=true。同样的问题。思想?