私はEFコードファーストモデルの初心者です。現在のレガシーMSSQLデータベースにマップされた2つのPOCOクラスがあるとします。それらは、1対多の関係を設定する複合外部キーに関連付けられています。これは実際には1対1の関係であるため、POCOオブジェクトに対応するナビゲーションプロパティを設定し、流暢なAPIでマッピングを行いたいと思います。これが私の例です:
public partial class Answer
{
//primary key
public int id { get; set; }
//foreign keys
public int question { get; set; }
public int assignedForm { get; set; }
//simple fields
public short state { get; set; }
public int author { get; set; }
//navigation property
public virtual AssignedQuestion AssignedQuestion { get; set; }
}
public partial class AssignedQuestion
{
// primary keys
public int id { get; set; }
public int assignedForm { get; set; }
//simple field
public string content { get; set; }
//navigation property
//public virtual ICollection<Answer> Answers { get; set; }
public virtual Answer Answer { get; set; }
}
1対多の関係を作成したい場合は、「Answers」コレクションのコメントを解除し、FluentAPIマッピングを使用します。
modelBuilder.Entity<AssignedQuestion>()
.HasKey(q => new { q.id, q.assignedForm });
modelBuilder.Entity<Answer>()
.HasRequired(a => a.AssignedQuestion)
.WithMany(aq=>aq.Answers)
.HasForeignKey(a => new { a.question,a.assignedForm});
私の目標は、1対1の関係で、AssignedQuestionの「Answer」プロパティを次のようなFluentAPIで使用することです。
modelBuilder.Entity<AssignedQuestion>()
.HasKey(q => new { q.id, q.assignedForm });
modelBuilder.Entity<Answer>()
.HasRequired(a => a.AssignedQuestion)
.WithOptional(aq => aq.Answer);
//.HasForeignKey(a => new { a.question, a.assignedForm });
問題は、(前の例のように)外部キーフィールドを正確に指定できず、HasForeignKey呼び出しのコメントを解除できないことです。この場合、EFは、Answerテーブルの「question」と「assignedForm」ではなく、従来のフィールド名「AssignedQuestion_ID」と「AssignedQuestion_AssignedForm」を使用してテーブルを結合しようとします。フィールド名を変更する以外に、Fluent APIにウォークアラウンドはありますか?