C# &引用;对象引用未设置为对象错误的实例;添加具有实体框架多对多关系的项时

C# &引用;对象引用未设置为对象错误的实例;添加具有实体框架多对多关系的项时,c#,linq,entity-framework,many-to-many,C#,Linq,Entity Framework,Many To Many,我有一个错误,我不知道,因为它没有提供任何细节,除了说对象引用没有设置为对象错误的实例。我在个人和课程类别之间有一种多对多的关系,定义如下。当我尝试向课程中添加一个新人(即,将一名学生注册到课程中)时,执行Linq语句的行中出现错误。我提供了守则的相关章节如下: 以下是引发错误的代码: Person userToRegister = _db.People.Single(p => p.Id == i.Value);//not null when debugging int courseId

我有一个错误,我不知道,因为它没有提供任何细节,除了说对象引用没有设置为对象错误的实例。我在个人和课程类别之间有一种多对多的关系,定义如下。当我尝试向课程中添加一个新人(即,将一名学生注册到课程中)时,执行Linq语句的行中出现错误。我提供了守则的相关章节如下:

以下是引发错误的代码:

Person userToRegister = _db.People.Single(p => p.Id == i.Value);//not null when debugging

int courseId = Convert.ToInt32(drp_Courses.SelectedValue);
Course myCourse = _db.Courses.Single(c => c.CourseId == courseId);//not null when debugging

myCourse.Members.Add(userToRegister);//This line throws the error
_db.SaveChanges();
以下是Person类:

public class Person : IdentityUser
{
    [Required]
    [StringLength(50, ErrorMessage = "First name cannot be longer than 50 characters.")]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    public List<Course> RegisteredCourses { get; set; }
}
public类人员:IdentityUser
{
[必需]
[StringLength(50,ErrorMessage=“名字不能超过50个字符。”)]
公共字符串名{get;set;}
[必需]
公共字符串LastName{get;set;}
公共列表RegisteredCourses{get;set;}
}
课程内容如下:

public class Course
{
    public int CourseId { get; set; }

    public string CourseTitle { get; set; }

    public List<Person> Members { get; set; }
}
公共课
{
public int CourseId{get;set;}
公共字符串CourseTile{get;set;}
公共列表成员{get;set;}
}
以下是DbContext类中关系的定义:

 modelBuilder.Entity<Course>()
                    .HasMany(c => c.Members)
                    .WithMany(p => p.RegisteredCourses)
                    .Map(m => m.MapLeftKey("CourseId").MapRightKey("Id")
                                                      .ToTable("EnrollmentsToCourse"));
modelBuilder.Entity()
.HasMany(c=>c.Members)
.WithMany(p=>p.RegisteredCourses)
.Map(m=>m.MapLeftKey(“CourseId”).MapRightKey(“Id”)
.ToTable(“注册课程”);
我觉得一切都很完美。有人能告诉我这里遗漏了什么吗?

将该行改为

Course myCourse = _db.Courses.Include(e => e.Members).Single(c => c.CourseId == courseId);
检查

if (myCourse.Members == null)
{
    myCourse.Members = new List<Member>();
}
if(myCourse.Members==null)
{
myCourse.Members=新列表();
}
将该行更改为

Course myCourse = _db.Courses.Include(e => e.Members).Single(c => c.CourseId == courseId);
检查

if (myCourse.Members == null)
{
    myCourse.Members = new List<Member>();
}
if(myCourse.Members==null)
{
myCourse.Members=新列表();
}

您是否故意不使用虚拟集合来阻止更改跟踪?您好@Noel,您能详细说明一下吗?您是否故意不使用虚拟集合来阻止更改跟踪?您好@Noel,您能详细说明一下吗?是的,我在检索相关数据时丢失了这些数据,它们是成员。非常感谢。如果任何人有只带字符串参数的Include方法,请不要忘记添加以下内容:
using System.Data.Entity是,我在检索相关数据时丢失了,该数据是成员。非常感谢。如果任何人有只带字符串参数的Include方法,请不要忘记添加以下内容:
using System.Data.Entity