【问题标题】:System.NullReferenceException when Inserting a new item for many-to-many relationship in entity framework在实体框架中为多对多关系插入新项目时出现 System.NullReferenceException
【发布时间】:2015-03-06 21:19:34
【问题描述】:

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

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)为空。以下是相关类的相关部分以及它们之间的关系:

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

流利的api代码:

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

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

【问题讨论】:

    标签: c# entity-framework many-to-many ef-fluent-api


    【解决方案1】:

    看起来DiscussionWall.Members 为空。它没有被您的代码初始化为任何东西。试试:

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

    另请参阅:Why is my Entity Framework Code First proxy collection null and why can't I set it?

    【讨论】:

    • 感谢您的回答!我想知道我是否只需要对我的类的 List 类型的属性执行此操作。假设每个讨论墙只有一个成员,我有这个属性public Person theMember。那么,我是否需要做同样的事情以免以后惹上麻烦?当我们第一次创建我们的类时,是否建议以这种方式定义这些属性?
    • 否,EF 在从您的代码生成数据库时,应将属性转换为列。如果您尝试将成员设置为导航属性,则它链接到的类中需要有一个互惠属性。这是一个多对多关系的示例:codeproject.com/Articles/234606/…
    • 抱歉,现在才意识到这可能是您最初尝试做的事情...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    相关资源
    最近更新 更多