Вначале в коде структуры сущности, как использовать KeyAttribute для нескольких столбцов

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

Спасибо!

Ответ 1

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

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

Ответ 2

Чтобы выполнить правильный ответ, представленный 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 
        });
    }
}

Ответ 3

Если, как и я, вы предпочитаете использовать конфигурационный файл, вы можете сделать это таким образом (на основе примера 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});
    }
}

Очевидно, что вы должны добавить файл конфигурации в свой контекст:

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

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