2013-10-14 3 views
29

外部キープロパティを指定するAPI:EFコードファースト流暢の私は、このようにエージェントに関連を持つクラスAgentBalance、持って

public class AgentBalance 
{ 
    ... 

    public int AgentId { get; set; } 

    public virtual Agent Agent { get; set; } 

} 

AGENTIDは、慣例により、エージェントの関係のためのFKとして検出されたが、私はしたいです将来の変更に対してより安全であるように、マッピングクラスで明示的にします。エージェントは、残高のコレクションを持っていたなら、私はこの例えばを行う方法を知っている:

HasRequired(t => t.Agent).WithMany(a => a.Balances).HasForeignKey(t => t.AgentId); 

しかし、エージェントは、残高のコレクションを持っていない - 私は、その関連が航行逆になりたくありません。しかし、マッピングの.WithManyがなければ、.HasForeignKeyを指定するオプションはありません。別の方法がありますか? (N.B.私は属性を使ってこれを行うこともできますが、流暢なAPIマッピングを使用したいと思います)。

答えて

48

私はあなたがこれを行うことができるはずと信じて:

HasRequired(t => t.Agent).WithMany().HasForeignKey(t => t.AgentId) 
+6

ありがとう:

public int AgentCode { get; set; } [ForeignKey("AgentCode")] // now this is needed if you'd like to have FK created public virtual Agent Agent { get; set; } 

あなたはここで詳細を見つけることができます!それでも、奇妙な構文のようです。あなたが何かを書くことができなかった理由は分かりません:HasRequired(t => t.Agent).HasForeignKey(t => t.AgentId) –

+1

EFがどのようなタイプを知る方法はありませんそれは関係のです。 – SOfanatic

+2

これは私のためには機能しません。 EFは、外部キー列として明示的に構成したAgentIdのほかに、新しいAgent_Id列を作成します。なぜこれが起こっているのか知っていますか? – Yulian

1

私はこれらのタスクではなく、流暢APIのためのデータ注釈を使用することを好みます。それは理解しやすいはるかに短い終わりです。プロパティを検出する必要があります EFは、自動的に「ID」で終わっていますが、それらを明示的に指定することができます安全のために:

using System.ComponentModel.DataAnnotations.Schema; 
... 
public int AgentId { get; set; } 

[ForeignKey("AgentId")] 
public virtual Agent Agent { get; set; } 

あなたのFKの小道具は、「ID」で終わっていない場合は、それらを明示的に指定する必要があります例えば: - 私はWithManyは()オーバーロードされたことを見逃していたhttps://msdn.microsoft.com/en-us/data/jj591583.aspx

+9

データ注釈は、わかりやすく読みやすいです。しかし、それは私の文脈である非常に大規模な複雑なプロジェクトで物事を管理する良い方法であるIMOではありません。 –

+0

@RichardPawsonなぜですか? – gsharp

+1

@gsharp DataAnnotationsはFluent APIほど強力ではないので、大規模なプロジェクトでは、DataAnnotationsで十分ではないため常にFluent APIを使用する必要があります。この場合、2つの場所で設定が完了し、モデルのすべての構成を1か所にまとめておくだけです。その間は – SOfanatic

関連する問題