спочатку в коді фреймворку сутності, як використовувати 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.