C# 添加到多对多模型表在除种子方法外的任何地方都有效

C# 添加到多对多模型表在除种子方法外的任何地方都有效,c#,asp.net-mvc,entity-framework,entity-framework-migrations,C#,Asp.net Mvc,Entity Framework,Entity Framework Migrations,我已经为此奋斗太久了 我有两个模型共享多对多关系。这些模型是: public class User { public int UserId { get; set; } public string UserName {get; set;} public virtual ICollection<Role> Roles { get; set; } } public class Role { public int RoleId {get; set;}

我已经为此奋斗太久了

我有两个模型共享多对多关系。这些模型是:

public class User
{
    public int UserId { get; set; }
    public string UserName {get; set;}

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

public class Role
{
    public int RoleId {get; set;}
    public string RoleName { get; set; }

    public virtual ICollection<User> Users { get; set; }
}
现在,这在整个应用程序中都能很好地工作,“User_Role”表中充满了代码,例如:user1.Roles.Add(role1)

然而,在我的Seed方法中,我在那一行得到一个空引用异常。我可以在调试时看到用户和角色都不是null。我试图跟踪堆栈跟踪,但看不到NRE的来源

我的种子方法调用如下:

User admin1 = context.Users.Where(p => p.Username == "DOMAIN\\username").FirstOrDefault();

//Here I add all the admins to a list of User called superAdmins

Role superAdminRole = context.Roles.Where(p => p.RoleName == "SuperAdmin").FirstOrDefault();

foreach (User user in superAdmins)
{
    if (user != null)
    {
        user.Roles.Add(superAdminRole); <-- this throws the exception

    }

}
User admin1=context.Users.Where(p=>p.Username==“DOMAIN\\Username”).FirstOrDefault();
//在这里,我将所有管理员添加到名为superAdmins的用户列表中
Role superAdminRole=context.Roles.Where(p=>p.RoleName==“SuperAdmin”).FirstOrDefault();
foreach(超级管理员中的用户)
{
如果(用户!=null)
{

user.Roles.Add(superAdminRole);我猜它在抱怨
Roles
集合为空。您应该在构造函数中实例化它:

public class User
{
    public User()
    {
        // instantiate navigation property
        this.Roles = new List<Role>();
    }

    public int UserId { get; set; }
    public string UserName {get; set;}

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

public class Role
{
    public Role()
    {
        // instantiate navigation property
        this.Users= new List<User>();
    }
    public int RoleId {get; set;}
    public string RoleName { get; set; }

    public virtual ICollection<User> Users { get; set; }
}
公共类用户
{
公共用户()
{
//实例化导航属性
this.Roles=新列表();
}
public int UserId{get;set;}
公共字符串用户名{get;set;}
公共虚拟ICollection角色{get;set;}
}
公共阶级角色
{
公共角色()
{
//实例化导航属性
this.Users=新列表();
}
public int RoleId{get;set;}
公共字符串RoleName{get;set;}
公共虚拟ICollection用户{get;set;}
}

哦,是的!就是这样!非常感谢!您介意解释一下为什么这只是Seed方法中的一个问题吗?再次感谢,您让我开心。也许Seed方法禁用了延迟加载。我不太确定。@GertArnold Dismissile的答案就是解决方案。谢谢您的光临:)
public class User
{
    public User()
    {
        // instantiate navigation property
        this.Roles = new List<Role>();
    }

    public int UserId { get; set; }
    public string UserName {get; set;}

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

public class Role
{
    public Role()
    {
        // instantiate navigation property
        this.Users= new List<User>();
    }
    public int RoleId {get; set;}
    public string RoleName { get; set; }

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