3

私は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にウォークアラウンドはありますか?

4

1 に答える 1

2

1 対 1 の関係ではないため、最初のマッピングは正しいです。1 対多である理由は、両側の PK でビルドする場合にのみ EF が 1 対 1 を理解するためです。AssignedQuestionPKがidありassignedFormAnswerその上に FK と PK が必要な場合idassignedFormそうでない場合、EF はそれを 1 対 1 の関係として認識しません。questionデータベースでandを一意の制約でマークしてもassignedForm(データベースで 1 対 1 にするため)、EF はまだ一意の制約をサポートしていないため、1 対 1 として処理できません (ただし、 PK)。

于 2012-05-29T08:29:14.570 に答える