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


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

спасибо!

4 76

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

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

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

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

использовать в качестве анонимного объекта:

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