最初にエンティティフレームワークコードで、複数の列でKeyAttributeを使用する方法


93

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

ありがとう!

回答:


153

たとえば、属性で列の順序を指定できます。

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
}

Find方法を使用しているDbSet場合は、キーパラメータのこの順序を考慮する必要があります。


1
InvalidOperationException:エンティティタイプ 'XXX'には、データアノテーションで定義された複合主キーがあります。複合主キーを設定するには、流れるようなAPIを使用します。
Luca Ziegler、

55

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、2011

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

7

私のように、構成ファイルを使用したい場合は、次の方法で実行できます(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 }); 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.