2017-02-16 8 views
1

ここでの質問は、2つの外部キーからなる複合主キーを生成する方法です。ASP.NETコアを持つ流暢なAPIの外部キーからなる複合主キーの作成

私が試してみました:

public class ActiveQuestions_Questions 
{ 
    [Column(Order = 0), Key, ForeignKey("ActiveQuestion")] 
    public string ActiveQuestionId {get; set;} 

    [Column(Order = 1), Key, ForeignKey("Question")] 
    public string QuestionId {get; set; } 
} 

私に与える:エンティティタイプ「をActiveQuestions_Questions」データの注釈で定義された複合主キーを持っています。複合主キーを設定するには、Fluent APIを使用します。

私はモデルビルダで流暢なAPIを使って注釈を使わずに試してみました。私を与えた

builder.Entity<ActiveQuestions_Questions>(
      build => 
      { 
       build.HasKey(t => new {t.ActiveQuestionId, t.QuestionId}); 
       build.HasOne(t => t.QuestionId).WithOne().HasForeignKey<Question>(qe => qe.QuestionId); 
       build.HasOne(t => t.ActiveQuestionId).WithOne().HasForeignKey<ActiveQuestion>(qe => qe.ActivateQuestionId); 
      } 
     );  

: ナビゲーションプロパティ「QuestionIdは」エンティティタイプ「ActiveQuestions_Questions」は同じ名前のプロパティが既にエンティティタイプ「ActiveQuestions_Questions」に存在するために追加することはできません。

正しい方向で私を指摘できる人はいますか?

質問クラス

public class Question 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public string QuestionId {get; set;} 

    [Required] 
    public string Text {get; set;} 
} 

ActiveQuestionクラス:EFコアで

public class ActiveQuestion 
{ 
    private DateTime _lastUpdated = DateTime.Now; 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public string ActivateQuestionId {get; set;} 

    public DateTime LastUpdated 
    { 
     get 
     { 
      return this._lastUpdated; 
     } 
     set 
     { 
      this._lastUpdated = value; 
     } 
    } 
} 
+0

「Question」と「ActiveQuestion」エンティティ(少なくともPKプロパティとActiveQuestions_Questions関連ナビゲーションプロパティを含む)の関連部分を投稿できますか? –

+0

@IvanStoev質問とActiveQuestionクラスを追加しました。 – Nyranith

+0

ありがとうございます。私は現在掲示されている答えは、ケースをカバーしていると思います。それが明確でない場合は、PKの流暢な構成は正しいが、FKはどちらも正しくない。 'build.HasOne(t => t.QuestionId)'は 'build.HasOne ()'にする必要があります 'build.HasOne ()'と 'build.HasOne(t => t.ActiveQuestionId)エンティティクラスにナビゲーションプロパティがないことを反映します。 –

答えて

3

KeyAttributeを用いた複合PKを定義するので、あなたは、複合PKを設定するには、流暢なAPIを使用する必要があり、サポートされていません。

build.HasKey(t => new {t.ActiveQuestionId, t.QuestionId}); 

上記の構文は、複合PKを定義する正しい方法です。詳細については、Keys(docs)を参照してください。

コードが失敗する理由は、関係が正しく設定されていないためです。 HasOne/WithOne APIは、ナビゲーションプロパティ(他のエンティティタイプを対象とするプロパティ)とともに使用されることになっています。あなたの設定では、HasOne呼び出しでプリミティブプロパティを渡しています。モデルにはすでに同じ名前のプロパティが追加されています(表記& HasKey呼び出し)ので、例外をスローします。たとえ追加されていなくても、異なる例外があります。 Hereは、流暢なAPIを使用してリレーションシップを定義する方法に関するドキュメントへのリンクです。

関連する問題