web-dev-qa-db-ja.com

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

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

ありがとう!

88
GilShalit

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

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
}

FindDbSetメソッドを使用している場合、重要なパラメーターのこの順序を考慮する必要があります。

144
Slauma

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 
        });
    }
}
50
Morteza Manavi

私のように、構成ファイルを使用したい場合は、この方法で(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());
    }
}
6

匿名オブジェクトとして使用:

modelBuilder.Entity<UserExamAttemptQuestion>().ToTable("Users").HasKey(o => new { o.UserId, o.Username }); 
0
WACS kumara