в коде структуры сущностей сначала, как использовать KeyAttribute на нескольких столбцах - PullRequest
86 голосов
/ 09 февраля 2011

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

Спасибо!

Ответы [ 4 ]

141 голосов
/ 10 февраля 2011

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

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

50 голосов
/ 10 февраля 2011

Чтобы завершить правильный ответ, представленный Слаумой, вы можете использовать метод 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 
        });
    }
}
6 голосов
/ 11 апреля 2013

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

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 голосов
/ 25 февраля 2018

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

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