EF 4.1コードが最初の複合キー


105

EFコードFirst 4.1 RCを使用して複合キーを作成する方法を理解しようとしています。

現在、[Key] Data Annotationを使用していますが、複数のキーを指定できません。

複合キーをどのように指定しますか?

これが私の例です:

 public class ActivityType
{
    [Key]
    public int ActivityID { get; set; }

    [Required(ErrorMessage = "A ActivityName is required")]
    [StringLength(50, ErrorMessage = "Activity Name must not exceed 50 characters")]
    public string ActivityName { get; set; }

}

「ActivityName」もキーにする必要があります。確かに、私はこれをコード化できますが、それは良いデータベース設計ではありません。

回答:


186

ActivityIDActivityNameプロパティの両方をマークすることができますKey注釈付けるか、@ taylonrで説明されているようにFluent APIを使用できます。

編集:

これは機能するはずです-注釈で定義された複合キーには明示的な列の順序が必要です:

public class ActivityType
{
    [Key, Column(Order = 0)]
    public int ActivityID { get; set; }

    [Key, Column(Order = 1)]
    [Required(ErrorMessage = "A ActivityName is required")]
    [StringLength(50, ErrorMessage = "Activity Name must not exceed 50 characters")]
    public string ActivityName { get; set; }

}

そうですか。更新してくれてありがとう。回答としてマークしました。
Bugnuker 2011

1
とにかく、実際にはキーではない一意の制約/インデックスを追加するには?
Shimmy Weitzhandler

105

アノテーションは使用せず、代わりにモデルビルダーをオーバーライドします。この場合、次のようなことができます。

modelBuilder.Entity<Activity>().HasKey(a => new { a.ActivityId, a.ActivityName });

これは機能しますが、機能する注釈を期待しています。CTP 4のサンプルがありましたが、4.1 RCでは動作しません
bugnuker

3
アノテーションを探していたのはわかっていましたが、これが検索に役立つかもしれないと思いました...アノテーションを使用していないと言ったので、あまり役に立ちませんでした...答えを見つけてください
taylonr

14
私はこのアプローチが好きです。モデルをコンテキストの問題から解放します。どうも。
ctorx

Fluent APIを使用して複合主キーを設定することがSQL CEで機能するかどうか誰かが知っていますか?私にとっては機能せず(「EntityType ...にキーが定義されていません」というエラーが表示されます)、新しい質問を作成するかどうか確信がありません。
kasitan 2013

単体テストの目的でDbContextを模擬している場合、エンティティや複合主キー間の関係を定義するために、modelBuilderが実行されていることをどのように確認しますか?
ジム・アホ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.