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!

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.


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 
        });
    }
}

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());
    }
}

0

Gunakan sebagai objek anonim:

modelBuilder.Entity<UserExamAttemptQuestion>().ToTable("Users").HasKey(o => new { o.UserId, o.Username }); 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.