сначала в коде entity framework, как использовать KeyAttribute для нескольких столбцов

Я создаю модель POCO для использования с кодом структуры сущности сначала CTP5. Я использую украшение, чтобы создать карту свойств для столбца PK. Но как я могу определить PK более чем для одного столбца и, в частности, как я могу контролировать порядок столбцов в индексе? Это результат порядка свойств в классе?

Спасибо!


person GilShalit    schedule 09.02.2011    source источник


Ответы (4)


Вы можете указать порядок столбцов в атрибутах, например:

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, вы должны принять во внимание этот порядок ключевых параметров.

person Slauma    schedule 09.02.2011
comment
InvalidOperationException: тип сущности «XXX» имеет составной первичный ключ, определенный с примечаниями к данным. Чтобы установить составной первичный ключ, используйте свободный API. - person Luca Ziegler; 17.11.2019

Чтобы завершить правильный ответ, отправленный 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 
        });
    }
}
person Morteza Manavi    schedule 09.02.2011
comment
Спасибо - оба метода работают нормально. Я предпочитаю атрибуты, потому что я генерирую свои классы из кода, а атрибуты гораздо более лаконичны. - person GilShalit; 10.02.2011
comment
Я лично также добавляю Propety (x ...). HasColumnOrder (0 ... n) к каждому из ключевых свойств. Это хорошо, плохо, безразлично? - person Suamere; 26.03.2015

Если, как и я, вы предпочитаете использовать файл конфигурации, вы можете сделать это следующим образом (на основе примера Манави):

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());
    }
}
person Daniele Armanasco    schedule 11.04.2013

Использовать как анонимный объект:

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