dalam kode kerangka entitas pertama, bagaimana menggunakan KeyAttribute pada beberapa kolom

95

Saya membuat model POCO untuk digunakan dengan kode kerangka entitas CTP5 pertama. Saya menggunakan dekorasi untuk membuat peta properti ke kolom PK. Tapi bagaimana saya bisa mendefinisikan PK di lebih dari satu kolom, dan secara khusus, bagaimana saya bisa mengontrol urutan kolom dalam indeks? Apakah ini hasil dari urutan properti di kelas?

Terima kasih!

GilShalit
sumber

Jawaban:

154

Anda dapat menentukan urutan kolom di atribut, misalnya:

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
}

Jika Anda menggunakan Findmetode a, DbSetAnda harus memperhatikan urutan parameter kunci ini.

Slauma
sumber
1
InvalidOperationException: Jenis entitas 'XXX' memiliki kunci utama gabungan yang ditentukan dengan anotasi data. Untuk menyetel kunci utama komposit, gunakan API fasih.
Luca Ziegler
57

Untuk melengkapi jawaban yang benar yang dikirimkan oleh Slauma, Anda dapat menggunakan metode HasKey untuk menentukan urutan kunci primer komposit juga:

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 
        });
    }
}
Morteza Manavi
sumber
2
Terima kasih - kedua metode berfungsi dengan baik. Saya lebih suka Atribut karena saya membuat kelas saya dari kode, dan atribut jauh lebih ringkas.
GilShalit
Saya pribadi juga menambahkan Propety (x ...) .HasColumnOrder (0 ... n) ke setiap properti keyed. Apakah itu baik, buruk, acuh tak acuh?
Suamere
8

Jika, seperti saya, Anda lebih suka menggunakan file konfigurasi, Anda dapat melakukannya dengan cara ini (berdasarkan contoh 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});
    }
}

Jelas Anda harus menambahkan file konfigurasi ke konteks Anda:

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

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

Gunakan sebagai objek anonim:

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