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; }
}