önce varlık çerçeve kodunda, KeyAttribute birden çok sütunda nasıl kullanılır?


95

Varlık çerçeve kodu ilk CTP5 ile kullanmak için bir POCO modeli oluşturuyorum. Bir PK sütununa bir özellik haritası yapmak için dekorasyonu kullanıyorum. Fakat birden fazla sütunda bir PK tanımlayabilirim ve özellikle, dizindeki sütunların sırasını nasıl kontrol edebilirim? Sınıftaki özelliklerin sırasının bir sonucu mu?

Teşekkürler!

Yanıtlar:


155

Niteliklerde sütun sırasını belirtebilirsiniz, örneğin:

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
}

A Findyöntemini kullanıyorsanız DbSet, anahtar parametreler için bu sırayı dikkate almalısınız.


1
InvalidOperationException: Varlık türü 'XXX', veri ek açıklamalarıyla tanımlanan bileşik birincil anahtara sahip. Bileşik birincil anahtarı ayarlamak için akıcı API kullanın.
Luca Ziegler

57

Slauma tarafından gönderilen doğru yanıtı tamamlamak için, birleşik birincil anahtarlar için bir sıra belirtmek üzere HasKey yöntemini de kullanabilirsiniz :

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
Teşekkürler - her iki yöntem de iyi çalışıyor. Öznitelikleri tercih ederim çünkü sınıflarımı koddan oluşturuyorum ve öznitelikler çok daha kısa.
GilShalit

Kişisel olarak ayrıca, anahtarlı özelliklerin her birine Propety (x ...). HasColumnOrder (0 ... n) ekliyorum. Bu iyi mi, kötü mü, kayıtsız mı?
Suamere

8

Benim gibi, bir yapılandırma dosyası kullanmayı tercih ediyorsanız, bunu şu şekilde yapabilirsiniz (Manavi'nin örneğine göre):

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

Açıkçası, yapılandırma dosyasını bağlamınıza eklemeniz gerekir:

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

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

0

Anonim nesne olarak kullanın:

modelBuilder.Entity<UserExamAttemptQuestion>().ToTable("Users").HasKey(o => new { o.UserId, o.Username }); 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.