1

我正在尝试与组和学生建立多对多关系,因此可以将学生分配到许多组,并且可以将许多学生分配给组。当我调用 context.savechanges() 时,我不断收到错误消息。在我的对象中,我确实有正确的配置,两者都有虚拟 ICollection。我的配置如下:

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();

然后当它到达 context.savechanges 我得到以下错误:

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

** 已解决 ** 原来我调用 phase.Groups.clear() 是问题所在,为什么我不知道。我希望现在可以告诉我为什么?

4

1 回答 1

3

在这种情况下调用Clear()您的集合只会尝试分离 thePhase和 the之间的关系,Group而不是实际删除对象。因此,您尝试将每个外键引用设置为 null,因此出现不可为 null 的异常。

我可以理解混淆的来源,毕竟我们可以phase.Groups.Add(...)用来添加一个新实体,但重要的是要记住它不适用于Remove()and Clear()

要实现您想要的,您可以DeleteObject()在每个要删除的组上使用:

context.Groups.DeleteObject(groupToDelete);
于 2013-03-01T01:51:41.347 回答