Entity framework EF 6.1从ICollection成员返回空结果的双向映射

Entity framework EF 6.1从ICollection成员返回空结果的双向映射,entity-framework,entity-framework-6,Entity Framework,Entity Framework 6,我有一组允许的角色,以及可以属于多个角色的用户 我需要查询角色的数量,并从用户实体中知道它所属的角色 第一个查询有效,第二个查询无效(不返回任何角色) 我的代码如下: class User { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid Id { get; set; } [Index(IsUnique=true)] public string Username { g

我有一组允许的角色,以及可以属于多个角色的用户

我需要查询角色的数量,并从用户实体中知道它所属的角色

第一个查询有效,第二个查询无效(不返回任何角色)

我的代码如下:

class User
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

   [Index(IsUnique=true)]
    public string Username { get; set; }

    public ICollection<Role> Roles { get; set; }

    public User()
    {
        this.Roles = new List<Role>();
    }
}

class Role
{
    [Key]
    public int Id { get; set; }

    [Index(IsUnique = true)]
    public string Name { get; set; }  

    public ICollection<User> Users { get; set; }
}

class MemberContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }
}
我希望能够运行以下查询:

using(var context = new MemberContext())
{
    var roles = context.Roles.Where(x => x.Name == "IdentityServerAdministrators").FirstOrDefault();
    // roles.Users is empty!!!

    var user = context.Users.Where(x => x.Username == "admin").FirstOrDefault();
    // user.Roles is empty!!
}
但是
roles.Users
user.roles
都返回空,但是查看上面的数据库表,它们应该有数据

我需要先通过EF代码显式设置映射吗?我做错了什么

更新1

我现在正在使用虚拟属性,但仍返回空值:

class Role
{
    [Key]
    public int Id { get; set; }

    [MaxLength(127)]
    [Index(IsUnique = true)]
    public string Name { get; set; }       

    public virtual ICollection<User> Users { get; set; }
}

class User
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    [Index(IsUnique = true)]
    [MaxLength(127)]
    public string Name { get; set; }
}


using (var context = new MemberContext())
{
    var unf1 = context.Roles.Where(x => x.Name == "IdentityServerAdministrators").FirstOrDefault();
    var wow1 = unf1.Users;
    // roles.Users is empty!!!

    var unf2 = context.Users.Where(x => x.Username == "admin").FirstOrDefault();
    var wow2 = unf2.Roles;
    // user.Roles is empty!!
}
类角色
{
[关键]
公共int Id{get;set;}
[MaxLength(127)]
[索引(IsUnique=true)]
公共字符串名称{get;set;}
公共虚拟ICollection用户{get;set;}
}
类用户
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
公共Guid Id{get;set;}
[索引(IsUnique=true)]
[MaxLength(127)]
公共字符串名称{get;set;}
}
使用(var context=new MemberContext())
{
var unf1=context.Roles.Where(x=>x.Name==“IdentityServerAdministrators”).FirstOrDefault();
var wow1=unf1.用户;
//角色。用户为空!!!
var unf2=context.Users.Where(x=>x.Username==“admin”).FirstOrDefault();
var wow2=unf2.角色;
//用户。角色为空!!
}

在查询中,您需要显式加载相关实体,因为您没有使用延迟加载

using(var context = new MemberContext())
{
    var roles = context.Roles.Include(x => x.Users).Where(x => x.Name == "IdentityServerAdministrators").FirstOrDefault();
    // roles.Users is empty!!!
    var user = context.Users.Include(x => x.Roles).Where(x => x.Username == "admin").FirstOrDefault();
    // user.Roles is empty!!
}

如果要延迟加载相关实体,导航属性必须是虚拟的。

谢谢,我已经在这些属性中添加了
virtual
关键字,但仍然返回空值。我知道数据是正确的,因为我可以在3个表的数据库中看到它
(dbo.Roles,dbo.UserRoles,dbo.Users)
-在8小时后更新了我的问题,我怀疑这是一个bug,从头开始做了一个独立的项目,它工作正常,但在我的DLL中它不工作。
using(var context = new MemberContext())
{
    var roles = context.Roles.Include(x => x.Users).Where(x => x.Name == "IdentityServerAdministrators").FirstOrDefault();
    // roles.Users is empty!!!
    var user = context.Users.Include(x => x.Roles).Where(x => x.Username == "admin").FirstOrDefault();
    // user.Roles is empty!!
}