如何插入具有相同导航属性值的多个实体?

时间:2016-12-13 09:26:36

标签: c# .net entity-framework

我有这样的POCO:

public class Student
{
    public int StudentId { get; set; }
    public string Name { get; set; }
    public Level Level { get; set; }
}

public class Level
{
    public int LevelId { get; set; }
    public string Name { get; set; }
    public ICollection<Student> Students { get; set; }


}

以下是我如何将所有学生保存在一个单一级别:

public void InsertAllFirstLevelStudents(List<Student> students)
{
    // Here all students belong to the same level
    var level = Utils.GetFirstLevel();

    students.ForEach(s => s.Level = level);
    context.Students.AddRange(students);
    context.SaveChanges();
}

但是在保存时,我收到了这个错误:

实体对象无法被IEntityChangeTracker的多个实例引用

当我单独获取相同级别时,如: context.Levels.FirstOrDefault(l =&gt; l.Name ==“First”); ,没有问题,但当然,它然后执行单独的数据库查询,这是我想要避免的。

可以为此做些什么?

2 个答案:

答案 0 :(得分:1)

public class Student
{
    public int StudentId { get; set; }
    public LevelId {get; set;}

    public string Name { get; set; }
    [ForeignKey("LevelId")]
    public Level Level { get; set; }
}

然后

students.ForEach(s => s.LevelId = level.LevelId);

答案 1 :(得分:1)

您只需将学生添加到该级别的Students集合即可。

// Here all students belong to the same level
var level = Utils.GetFirstLevel();

foreach (var student in students) {
    level.Students.Add(student);
}
context.Students.AddRange(students); // Probably not necessary
context.SaveChanges();