我正在使用EF7 beta 7.我有几个论坛样式表,它们之间有一个导航属性,以及在上下文的OnModelCreating
方法中设置的关系:包括不包括导航属性,除非ToList被调用
public class Forum
{
public int ForumId { get; set; }
public string Title { get; set; }
public ICollection<Topic> Topics { get; set; } = new List<Topic>();
}
public class Topic
{
public int TopicId { get; set; }
public string Title { get; set; }
public int ForumId { get; set; }
public Forum Forum { get; set; }
}
public class MyContext : DbContext
{
public DbSet<Forum> Forums { get; set; }
public DbSet<Topic> Topics { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Forum>()
.Collection(f => f.Topics)
.InverseReference(t => t.Forum)
.ForeignKey(t => t.ForumId);
}
}
我试图让Forum
列表与Topic
的计数:
var forums = _context.Forums.Include(f => f.Topics)
.Select(f => new
{
f.Title,
f.ForumId,
f.Topics.Count
});
当我运行该原样,
我得到一个
我得到一个空因为它似乎没有真正加载ArgumentNullException
Topic
s。我已经检查了Sql Profiler
,并确认它只运行选择获得Forum
的选项,并且没有第二选择Topic
的选项。
如果我的Select
之前调用ToList
这样
var forums = _context.Forums.Include(f => f.Topics)
.ToList()
.Select(f => new
{
f.Title,
f.ForumId,
f.Topics.Count
});
它将包含Topic
的和代码运行,但是这违背了目的,因为这会导致它枚举所有论坛的所有主题和然后计数,而不是在数据库上运行Count
。这是一个与Include
错误,或者我使用Include
错?
我还没有EF7工作,只有6所以也许它改变,但不会将您的导航属性必须'virtual'为了支持急切和懒惰加载? – dman2306
@ dman2306我只是试图让它们变成'虚拟'而没有改变。我不认为在EF 6中这是必需的... –