спочатку в коді фреймворку сутності, як використовувати KeyAttribute на декількох стовпцях


93

Я створюю модель POCO, яка спочатку використовується з кодом фреймворку CTP5. Я використовую прикрасу для складання карти властивостей до стовпця PK. Але як я можу визначити PK для більш ніж одного стовпця, а конкретно, як я можу контролювати порядок стовпців в індексі? Це результат порядку властивостей у класі?

Дякую!

Відповіді:


153

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

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ви повинні врахувати це замовлення для ключових параметрів.


1
InvalidOperationException: Тип сутності 'XXX' має складений первинний ключ, визначений із анотаціями даних. Щоб встановити складений первинний ключ, використовуйте вільний API.
— Лука Зіглер

55

Щоб заповнити правильну відповідь, надіслану 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) до кожного з ключових властивостей. Це добре, погано, байдуже?
— Суамер

7

Якщо, як я, ви віддаєте перевагу використовувати файл конфігурації, ви можете зробити це таким чином (на прикладі Манаві):

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 }); 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.