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

95

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

Благодарность!

ГилШалит
источник

Ответы:

155

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

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

Slauma
источник
1
InvalidOperationException: тип сущности «XXX» имеет составной первичный ключ, определенный с аннотациями к данным. Чтобы установить составной первичный ключ, используйте свободный API.
Лука Циглер
58

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

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

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());
    }
}
Даниэле Арманаско
источник
0

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

modelBuilder.Entity<UserExamAttemptQuestion>().ToTable("Users").HasKey(o => new { o.UserId, o.Username }); 
WACS кумара
источник