使用虚拟 ICollection 属性时包含实体框架

问题描述 投票:0回答:1

我正在迁移到 EF6,希望能够充分利用

Include
急切加载功能。然而,在运行一些测试后,似乎无法将实体的虚拟集合与
Include
函数一起使用。

考虑以下定义:

class Group
{
    public virtual ICollection<Member> Members {get;set;}
}
class Member
{
    public int ID {get;set;}
    public virtual User User {get;set;}
}

我很困惑为什么在使用

Include
时无法调用虚拟集合属性,因为急切地加载这样的附加数据很有意义:

group.Members.Include(m => m.User);

而不是做这样烦人的事情:

using (var db = Context()) 
{
    var memberIds = group.Members.Select(m => m.ID);
    db.Members.Include(m => m.User).Where(m => memberIds.Includes(m.ID));
}

如果我们不能在新的高效查询中使用这些虚拟集合快捷方式,那么它们还有什么意义呢?请注意,我尝试添加

.AsQueryable()
,这不会导致任何连接,而只是像往常一样延迟加载。

c# .net entity-framework
1个回答
0
投票

当你有两个模型并且模型之间存在关系时。像这样:

public class User
{
    public int Id { get; set; }
    
    public string Name { get; set; }
}

public class Member 
{
    public int Id { get; set; }
    
    public int UserId { get; set; }

    public User User { get; set; }
}

如果您加载成员而不包含成员。用户为空

如果您使用包含具有此条件的用户

User.Id == Member.UserId
加载并在member.User中设置

var member = dbContext.Members.Include(m => m.User).First();

当您使用 include 时,EF 会生成 sql 查询:

select top 1 m.*, u.*
from Members m
join users u on u.Id = m.UserId
© www.soinside.com 2019 - 2024. All rights reserved.