0

EFコードファーストモデルを使用しています。私は3つのテーブルを持っていますTeacherStudentそしてAddress。各教師と生徒は複数のアドレスを持つことができるため、との間の関連付けTeacher_AddressStudent_Address1対多です。

このために私は書いた:

public class Teacher 
{
 public int Id;

 public virtual List<Address> Addresses { get; set; }
}

public class Student 
{
 public int Id;

 public virtual List<Address> Addresses { get; set; }
}

public class Address
{
 public int Id;

 public int? TeacherId { get; set; }
 public virtual Teacher Teacher { get; set; }

 public int? StudentId { get; set; }
 public virtual Student Student { get; set; }
} 

流暢なAPI:

        //Creating 1 to * relationships b\w Teacher and Address
        modelBuilder.Entity<Address>().HasOptional(p => p.Teacher)
                                      .WithMany(p => p.Addresses)
                                      .HasForeignKey(p => p.TeacherId)
                                      .WillCascadeOnDelete();

        //creating 1 to * replationship b\w Student and Address
        modelBuilder.Entity<Address>().HasOptional(p => p.Student)
                                      .WithMany(p => p.Addresses)
                                      .HasForeignKey(p => p.StudentId)
                                      .WillCascadeOnDelete();

TeacherのデータをStudent問題なく挿入できますが、いずれかの行を削除しようとするTeacherStudent、次の例外が表示されます。

DELETEステートメントがREFERENCE制約「FK_dbo.Address_dbo.Teacher_TeacherId」と競合していました。データベース「CodeFirst.TestContext」、テーブル「dbo.Address」、列「TeacherId」で競合が発生しました。

誰かがこの問題を解決する方法と私が間違っていることを教えてもらえますか?

4

1 に答える 1

0

関係が逆になっているようです。教師と生徒がアドレスを参照する必要はありません。アドレスエントリを削除すると、カスケードが正しく機能すると思います(これはあなたが望んでいるものではありません)。アドレス ID を他のエンティティに追加してみて、削除が機能するかどうかを確認してください。

このようなもの:

public class Teacher 
{
 public int Id;

 public virtual List<Address> Addresses { get; set; }
}

public class Student 
{
 public int Id;

 public virtual List<Address> Addresses { get; set; }
}

public class Address
{
 public int Id;

} 

流暢な API:

modelBuilder.Entity<Teacher>().HasMany(p => p.Addresses)
                                  .WillCascadeOnDelete();
于 2013-03-09T19:23:33.080 に答える