Klucz złożony z EF 4,1 Code First

105

Próbuję dowiedzieć się, jak mieć klucz złożony przy użyciu kodu EF First 4.1 RC.

Obecnie używam adnotacji danych [Klucz], ale nie mogę określić więcej niż jednego klucza.

jak można określić klucz złożony?

Oto mój przykład:

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

}

Potrzebuję, aby „ActivityName” również było kluczem. Jasne, mogę kodować wokół tego, ale to nie jest dobry projekt bazy danych.

bugnuker
źródło

Odpowiedzi:

186

Możesz oznaczyć zarówno właściwości, jak ActivityIDi ActivityNamewłaściwości za pomocą Keyadnotacji lub możesz użyć interfejsu API Fluent zgodnie z opisem @taylonr.

Edytować:

To powinno działać - klucz złożony zdefiniowany za pomocą adnotacji wymaga wyraźnej kolejności kolumn:

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

}
Ladislav Mrnka
źródło
Widzę. Dzięki za zaktualizowanie mnie. Oznaczono jako odpowiedź.
bugnuker
1
W każdym razie, aby dodać unikalne ograniczenia / indeksy, które tak naprawdę nie są kluczami?
Shimmy Weitzhandler
105

Nie używamy adnotacji, zamiast tego nadpisujemy konstruktora modelu, w takim przypadku możesz zrobić coś takiego:

modelBuilder.Entity<Activity>().HasKey(a => new { a.ActivityId, a.ActivityName });
taylonr
źródło
to działa, ale mam nadzieję na adnotację, która działa. Były próbki z CTP 4, ale te już nie działają w 4.1 RC
bugnuker
3
Wiem, że szukałeś adnotacji, ale pomyślałem, że to może pomóc w wyszukiwaniu ... tak jak powiedziałem, że nie używamy adnotacji, więc nie
pomogłem
14
Podoba mi się to podejście. Utrzymuje model bez problemów związanych z kontekstem. Dzięki.
ctorx
Czy ktoś wie, czy ustawienie złożonego klucza podstawowego przy użyciu interfejsu Fluent API działa w przypadku SQL CE? To nie działa dla mnie (wyświetla błąd, że „EntityType ... nie ma zdefiniowanego klucza”) i nie jestem pewien, czy utworzyć nowe pytanie, czy nie.
kasitan
Jeśli mockujesz DbContext w celu testowania jednostkowego, jak upewnić się, że modelBuilder jest wykonywany w celu zdefiniowania relacji między jednostkami i / lub złożonymi kluczami podstawowymi?
Jim Aho,