如何插入使用多对多关系与实体框架

本文关键字:关系 框架 实体 何插入 插入 | 更新日期: 2023-09-27 18:01:42

我正在尝试与组和学生建立多对多的关系,因此学生可以分配到许多组,组可以有许多学生分配到它。当我去调用context.savechanges()时,我一直得到一个错误。在我的对象中,我确实有适当的配置,两者都有虚拟集合。我的配置如下:

public class DataContext : DbContext
{
    public DbSet<Student> StudentsContext { get; set; }
    public DbSet<Group> GroupsContext { get; set; }
    public DbSet<Phase> PhaseContext { get; set; }
    public DbSet<Admin> AdminContext { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Student>()
            .HasMany(g => g.Groups)
            .WithMany(s => s.GroupMembers)
            .Map(x => x.MapLeftKey("StudentId")
                .MapRightKey("GroupId")
                .ToTable("Student_XRef_Group"));
    }
}

然后在控制器中,作为测试,我将尝试:

        var phase = phaseRepository.Select().SingleOrDefault(x => x.PhaseId == phaseId);
        phase.Groups.Clear();
        //Testing
        Group testGroup = new Group();
        testGroup.GroupNumber = 1;
        testGroup.GroupMembers.Add(AllStudents[0]); //Students of type Student
        phase.Groups.Add(testGroup);
        //Testing
        context.SaveChanges();

当它到达上下文时。我得到以下错误:

操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性被设置为空值。如果外键不支持空值,则必须定义一个新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

**已解决**事实证明,我调用phase.Groups.clear()是问题所在,为什么我不知道。我希望你能告诉我为什么?

如何插入使用多对多关系与实体框架

在这种情况下,在集合上调用Clear()只是试图分离PhaseGroup之间的关系,而不是实际删除对象。因此,您试图将每个外键的外键引用设置为空,从而产生非空异常。

我可以理解混乱来自哪里,毕竟我们可以使用phase.Groups.Add(...)来添加一个新的实体,但重要的是要记住,它不能为Remove()Clear()工作。

为了达到你想要的效果,你可以在每个组上使用DeleteObject()来删除:

context.Groups.DeleteObject(groupToDelete);