私は最初に、多肢選択問題を含む単純なデータベースにEntityFrameworkコードを使用しています。各質問には複数の可能な回答があり、1つを正解として指定します。
public class Question
{
public int QuestionId { get; set; }
[ForeignKey("CorrectAnswer")]
public int CorrectAnswerId { get; set; }
public string Text { get; set; }
public virtual ICollection<Answer> Answers { get; set; }
public virtual Answer CorrectAnswer { get; set; }
}
public class Answer
{
public int AnswerId { get; set; }
[ForeignKey("Question")]
public int QuestionId { get; set; }
public string Text { get; set; }
public virtual Question Question { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Answer>()
.HasRequired(a => a.Question)
.WithMany(q => q.Answers)
.HasForeignKey(a => a.QuestionId)
.WillCascadeOnDelete(false);
}
これはすべて正常に機能しますが、正解が必要なために質問を作成できないが、質問が必要なために回答を作成できないというキャッチ22の状況を回避する必要があります。そこで、CorrectAnswerIdフィールドをnull許容にして、質問を作成し、次に回答を作成してから、正解を指定できるようにします。
次のバリエーションを試しましたが、常に「競合する多重度」の例外が発生します。
modelBuilder.Entity<Question>()
.HasOptional(q => q.CorrectAnswer)
.WithRequired(a => a.Question)
.Map(p => p.MapKey("CorrectAnswerId"));