Entity Framework 5 と Code First を使用しています。
クイズ アプリケーションの2 つのドメイン エンティティQuestionとAnswerがあります。1 つの質問には、複数の可能な回答があります。質問には、可能な回答の 1 つを参照する必要がある 1 つの正解もあります。to エンティティ間の 1 対多および 1 対 1 の関係の組み合わせでいくつかの問題が発生しています。Q1とQ2を参照してください。
これはエンティティのコードです:
public class Question
{
public virtual int Id { get; set; }
[Required]
public virtual string Text { get; set; }
[InverseProperty("Question")]
public virtual ICollection<Answer> PossibleAnswers { get; set; }
public virtual Answer CorrectAnswer { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public virtual DateTime? UpdateStamp { get; set; }
}
public class Answer
{
public virtual int Id { get; set; }
[Required]
public virtual string Text { get; set; }
[ForeignKey("QuestionId")]
public virtual Question Question { get; set; }
public virtual int QuestionId { get; set; }
}
Q1:データベースへの 1 回のラウンドトリップ (たとえば、コンテキスト SaveChanges への 1 回の呼び出し) で Question オブジェクトと参照された Answers (PossibleAnswers プロパティを介して) を挿入できるようにするにはどうすればよいですか? 最初に回答を追加せずに質問と回答を保存すると、次のエラーが表示されます。
依存操作の有効な順序を判別できません。外部キーの制約、モデルの要件、またはストアで生成された値が原因で、依存関係が存在する場合があります。
その問題を解決するために、流暢なAPIを使用して次のことを試し、オブジェクトコンテキストのSaveChangesを1回呼び出すだけですべてを実行するときに、質問の前に回答が追加されるようにしました。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Question>()
.HasOptional(q => q.CorrectAnswer)
.WithRequired();
base.OnModelCreating(modelBuilder);
}
ただし、それにより別のエラーが発生しました。
競合する変更が検出されました。これは、同じキーを持つ複数のエンティティを挿入しようとしたときに発生することがあります。
Q1 の流暢な API アプローチで正しい道を進んでいますか? なぜエラーメッセージが表示されるのですか?
Q2 : 質問を削除すると、回答の前に質問を削除することはできず、またその逆もできないため、エラーが発生することがわかりました。これを解決するにはどうすればよいですか?たとえば、WillCascadeOnDelete は Question.CorrectAnswer と Question.PossibleAnswers の両方で指定する必要がありますか?