関連するエンティティを持つエンティティを両方とも1つのDbSet.Add呼び出しに挿入する必要があります。EF6 - ナビゲーションプロパティのみで関連するエンティティを持つエンティティを挿入するときのエラー
public class Course
{
public Course() { }
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
...
public virtual ICollection<CourseProfesor> Profesors { get; set; }
}
public class CourseProfesor
{
public CourseProfesor() { }
[Key]
public int ID { get; set; }
[Required, Index, Column(Order = 0)]
public int CourseID { get; set; }
[Required, Index, Column(Order = 1)]
public int ProfesorID { get; set; }
...
[ForeignKey("CourseID")]
public virtual Course Course { get; set; }
[ForeignKey("ProfesorID")]
public virtual Profesor Profesor { get; set; }
}
マッピング:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Course>().HasMany(x => x.Profesors).WithRequired(x => x.Course);
modelBuilder.Entity<CourseProfesor>().HasRequired(x => x.Course).WithMany(x => x.Profesors);
modelBuilder.Entity<CourseProfesor>().HasRequired(x => x.Profesor).WithMany(x => x.Courses);
}
コントローラー:
一対多コースとCourseProfesor間は
エンティティ(CourseProfesorエンティティ接続コースとProfesorsです)
public ActionResult Add(Course course, int profesorId = 0)
{
if (profesor > 0)
{
course.Profesors = new List<CourseProfesor>();
course.Profesors.Add(new CourseProfesor() { Course = course, CourseID = 0, ProfesorID = profesorId, From = DateTime.Now, Role = ... });
}
Facade.Create(course);
return Json(new {statusText = "Course Added"});
}
Facade.Create(エンティティ)が順番に
DbContext.Set(entity.GetType()).Add(entity)
私が得る例外呼び出すCreateCommand実行:
データベースへの変更が正常にコミットされたのが、更新中にエラーが発生しましたオブジェクトコンテキスト。 ObjectContextが矛盾した状態になっている可能性があります。内部例外メッセージ:参照整合性制約違反が発生しました:リレーションシップの一方の「Course.ID」のプロパティ値が、他方の「CourseProfesor.CourseID」のプロパティ値と一致しません。
CourseProfesor.CourseIDを割り当てる方法は、コースのIDがまだわからない場合、どちらも新しいエンティティですか?
コントローラーコードでわかるように、私はナビゲーションプロパティーだけを設定することでそれを解決しました。それに応じて、EFはそれに応じて外部キーを自動入力します。
これは重要です:これは私がEF5はなかったがEF6がその例外をスローする理由
どれでも手がかりをEF6するために更新した後、そのエラーを得たEF5、に罰金働いていましたか?最初にコースを作成しなくても、それからCourseProfesor関係エンティティを作成することなくそれを解決する方法はありますか?
エンティティマッピング/設定とエンティティクラスを設定する必要があります。 EF6はこれらをうまく処理しますが、エンティティの関係とキー生成に関する規則について十分な情報があることを保証する必要があります。 –
ありがとうございます。私はエンティティと設定で質問を編集しました。申し訳ありません、私の最初の質問です。 – Lucio