2011-02-09 3 views
62

エンティティフレームワークコードで最初に使用するPOCOモデルを作成します。私はデコレーションを使用して、PK列へのプロパティマップを作成しています。しかし、どのように複数の列にPKを定義することができますか?具体的には、どのようにインデックスの列の順序を制御できますか?クラスのプロパティの順序の結果ですか?を最初に使用する方法複数の列でKeyAttributeを使用する方法

ありがとうございます!

答えて

109

あなたは、例えば、属性で列の順序を指定することができます:あなたはDbSetFind方法を使用している場合

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

    [Key, Column(Order=1)] 
    public int MySecondKeyProperty { get; set; } 

    [Key, Column(Order=2)] 
    public string MyThirdKeyProperty { get; set; } 

    // other properties 
} 

アカウントへの重要なパラメータのために、この注文を取る必要があります。

38

Slaumaから提出された正しい答えを完了するには、あなたにも複合主キーの順序を指定するHasKeyメソッドを使用することができます。私のように、設定を使用することを好む、場合

public class User 
{   
    public int UserId { get; set; }  
    public string Username { get; set; }   
}   

public class Ctp5Context : DbContext 
{ 
    public DbSet<User> Users { get; set; }   

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>().HasKey(u => new 
     { 
      u.UserId, 
      u.Username 
     }); 
    } 
} 
+2

おかげで - 両方の方法がうまく動作します。私はコードからクラスを生成しているので属性を優先し、属性ははるかに簡潔です。 – GilShalit

+0

個人的には、それぞれのキー付きプロパティにPropety(x ...)。HasColumnOrder(0 ... n)を追加します。それは良い、悪い、無関心ですか? – Suamere

5

をあなたは(Manaviの例に基づいて)このような方法でそれを行うことができますファイル:

public class User 
{ 
    public int UserId { get; set; } 
    public string Username { get; set; } 
} 

public class UserConfiguration : EntityTypeConfiguration<User> 
{ 
    public UserConfiguration() 
    { 
     ToTable("Users"); 
     HasKey(x => new {x.UserId, x.Username}); 
    } 
} 

を明らかにあなたのコンテキストにコンフィギュレーションファイルを追加する必要があります。

匿名オブジェクトとして
public class Ctp5Context : DbContext 
{ 
    public DbSet<User> Users { get; set; }   

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new UserConfiguration()); 
    } 
} 
0

用途:

modelBuilder.Entity<UserExamAttemptQuestion>().ToTable("Users").HasKey(o => new { o.UserId, o.Username }); 
関連する問題