我正在尝试与小组和学生建立多对多的关系,因此可以将学生分配到许多小组,小组可以分配许多学生。当我去调用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时,我收到以下错误:
操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为foreign-key属性分配另一个非空值,或者必须删除不相关的对象。
**已解决** 事实证明,我调用phase.Groups.clear()是个问题,为什么我不知道。我希望现在可以告诉我为什么?
答案 0 :(得分:2)
在这种情况下,对集合调用Clear()
只会尝试分离Phase
和Group
之间的关系,而不是实际删除对象。因此,您尝试将每个外键引用设置为null,因此不可为空的异常。
我可以理解混淆的来源,毕竟我们可以使用phase.Groups.Add(...)
添加新实体,但重要的是要记住它对Remove()
和{{不相反1}}。
要实现您的目标,您可以在每个组上使用Clear()
来删除:
DeleteObject()