在实体框架中为多对多关系插入新项时出现System.NullReferenceException

本文关键字:新项时 NullReferenceException System 插入 框架 实体 关系 | 更新日期: 2024-10-20 19:37:09

为多对多关系添加项目时,我收到此错误

gEchoLu.dll中发生"System.NullReferenceException"类型的异常,但未在用户代码中处理

没有进一步的细节。

以下是引发异常的代码:

protected void btn_AddMembers_Click(object sender, EventArgs e)
{
        gEchoLuDBContext _db = new gEchoLuDBContext();
        int wallId = Convert.ToInt32(grd_Walls.SelectedDataKey.Value);
        DiscussionWall selectedWall = _db.DiscussionWalls.Single(dw => dw.WallId == wallId);
        foreach (ListItem item in cbList_AllMembers.Items)
        {
            if (item.Selected)//if the checkbox item (i.e., user) is selected
            {
                Person selectedPerson = _db.People.Single(p => p.Id == item.Value.ToString());
//then retrieve the user from db
                selectedWall.Members.Add(selectedPerson);//**this line throws the error**
//add user to the selected wall
            }
        }
        _db.SaveChanges();
        BindWallMembers();
}

在上面的代码中,当我调试它时,我看到没有一个实例(selectedWallselectedPerson)为null。以下是相关类的相关部分以及它们之间的关系:

public class DiscussionWall
{
    [Key]
    public int WallId { get; set; }
    public List<Person> Members { get; set; }
}
[Table("AspNetUsers")]
public class Person : IdentityUser
{
    public List<Course> RegisteredCourses { get; set; }
    public List<DiscussionWall> AttendedDiscussionWalls { get; set; }
}

Fluent api代码:

modelBuilder.Entity<DiscussionWall>()
            .HasMany(dw => dw.Members)
            .WithMany(p => p.AttendedDiscussionWalls)
            .Map(m => m.MapLeftKey("WallId").MapRightKey("Id")
            .ToTable("EnrollmentsToDiscussionWalls"));

有人知道我的逻辑和代码出了什么问题吗?

在实体框架中为多对多关系插入新项时出现System.NullReferenceException

看起来DiscussionWall.Members为null。您的代码不会将其初始化为任何内容。尝试:

private List<Person> _members;
public List<Person> Members
{
  get { return _members ?? (_members = new List<Person>()); }
  set { _members = value; }
}

另请参阅:为什么我的实体框架代码优先代理集合为null,为什么我不能设置它?