簡體   English   中英

如何使用與實體框架的多對多關系插入

[英]How to insert using many to many relationship with entity framework

我正在嘗試與小組和學生建立多對多的關系,因此學生可以被分配到許多小組,小組可以分配許多學生。 當我去調用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()是問題,為什么我不知道。 我希望也許現在可以告訴我為什么?

在這種情況下,對集合調用Clear()只會嘗試分離PhaseGroup之間的關系,而不是實際刪除對象。 因此,您嘗試將每個的外鍵引用設置為null,因此不可為空的異常。

我可以理解混淆的來源,畢竟我們可以使用phase.Groups.Add(...)來添加一個新的實體,但重要的是要記住它不適用於Remove()Clear()

要實現所需,可以在每個組上使用DeleteObject()來刪除:

context.Groups.DeleteObject(groupToDelete);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM