Составной ключ с EF 4.1 Code First

105

Я пытаюсь понять, как получить составной ключ с помощью кода EF First 4.1 RC.

В настоящее время я использую аннотацию данных [Key], но я не могу указать более одного ключа.

как указать составной ключ?

Вот мой пример:

 public class ActivityType
{
    [Key]
    public int ActivityID { get; set; }

    [Required(ErrorMessage = "A ActivityName is required")]
    [StringLength(50, ErrorMessage = "Activity Name must not exceed 50 characters")]
    public string ActivityName { get; set; }

}

Мне нужно, чтобы «ActivityName» также было ключом. Конечно, я могу это исправить, но это не лучший дизайн базы данных.

бугнукер
источник

Ответы:

186

Вы можете отметить как ActivityIDи ActivityNameсвойство с Keyаннотацией или вы можете использовать свободно API , как описано @taylonr.

Редактировать:

Это должно работать - составной ключ, определенный с аннотациями, требует явного порядка столбцов:

public class ActivityType
{
    [Key, Column(Order = 0)]
    public int ActivityID { get; set; }

    [Key, Column(Order = 1)]
    [Required(ErrorMessage = "A ActivityName is required")]
    [StringLength(50, ErrorMessage = "Activity Name must not exceed 50 characters")]
    public string ActivityName { get; set; }

}
Ладислав Мрнка
источник
Понимаю. Спасибо, что обновили меня. Помечено как ответ.
bugnuker
1
В любом случае добавить уникальные ограничения / индексы, которые на самом деле не являются ключами?
Shimmy Weitzhandler
105

Мы не используем аннотации, вместо этого мы переопределяем построитель модели, и в этом случае вы можете сделать что-то вроде:

modelBuilder.Entity<Activity>().HasKey(a => new { a.ActivityId, a.ActivityName });
Тайлонр
источник
это действительно работает, но я надеюсь, что аннотация работает. Были образцы с CTP 4, но они больше не работают в 4.1 RC
bugnuker
3
Я знаю, что вы искали аннотации, но подумали, что это может помочь в поиске ... как я уже сказал, мы не используем аннотации, поэтому я не особо помог ... надеюсь, вы найдете ответ
taylonr
14
Мне нравится такой подход. Сохраняет модель чистой от проблем контекста. Спасибо.
ctorx 03
Кто-нибудь знает, работает ли установка составного первичного ключа с использованием свободного API для SQL CE? У меня это не работает (выдает ошибку «EntityType ... не определен ключ»), и я не уверен, что создам новый вопрос или нет.
Каситан 05
Если вы имитируете свой DbContext для целей модульного тестирования, как вы убедитесь, что modelBuilder выполняется для определения взаимосвязи между сущностями и / или составными первичными ключами?
Джим Ахо