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に到達すると、次のエラーが発生します。

操作が失敗しました:1つ以上の外部キープロパティがnull許容でないため、関係を変更できませんでした。リレーションシップに変更が加えられると、関連する外部キープロパティがnull値に設定されます。外部キーがnull値をサポートしていない場合は、新しい関係を定義するか、外部キープロパティに別の非null値を割り当てるか、無関係のオブジェクトを削除する必要があります。

**解決済み**phase.Groups.clear()を呼び出すことが問題だったことがわかりました。なぜ、私にはわかりません。多分今理由を教えてくれると思っていましたか?

4

1 に答える 1

3

この場合、コレクションを呼び出すと、とのClear()間の関係が切り離されようとするだけで、実際にはオブジェクトが削除されません。したがって、それぞれの外部キー参照をnullに設定しようとしているため、null不可の例外になります。PhaseGroup

混乱がどこから来ているのかは理解できます。結局phase.Groups.Add(...)、新しいエンティティを追加するために使用できますが、との場合は逆に機能しないことを覚えておくことが重要Remove()ですClear()

あなたが望むものを達成するために、あなたはDeleteObject()削除したい各グループで使うことができます:

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