Ustawiasz wyjątkowe ograniczenie dzięki płynnemu API?
185
Próbuję zbudować jednostkę EF z kodem Najpierw i za EntityTypeConfigurationpomocą płynnego interfejsu API. tworzenie kluczy podstawowych jest łatwe, ale nie jest tak dzięki Unikalnemu Ograniczeniu. Widziałem stare posty sugerujące wykonywanie natywnych poleceń SQL w tym celu, ale wydaje się, że to nie udaje się. czy jest to możliwe dzięki EF6?
Oto bardziej realistyczny przykład. Dodaje unikalny indeks do wielu właściwości: User.FirstNameoraz User.LastNameo nazwie indeksu „IX_FirstNameLastName”
Jest to wymagane do nazwania adnotacji w kolumnie „Indeks”! Napisałem inne imię i to nie działało! Spędziłem godziny, zanim spróbowałem zmienić nazwę na oryginalny „Indeks” jak w twoim poście i zrozumiałem, że to ważne. :( Musi istnieć stała w ramach, aby nie kodować łańcucha na stałe.
Alexander Vasilyev
10
@AlexanderVasilyev Stała jest zdefiniowana jakoIndexAnnotation.AnnotationName
Nathan
3
@Nathan Dziękujemy! Otóż to! Przykład w tym poście musi zostać poprawiony przy użyciu tej stałej.
Aleksander Wasiljew
2
Nie można go znaleźć w EF7 - DNX
Shimmy Weitzhandler
2
Uważam, że IsUnique należy ustawić na true podczas tworzenia IndexAttribute w pierwszym przykładzie. Tak: new IndexAttribute() { IsUnique = true }. W przeciwnym razie tworzy tylko zwykły (nieunikalny) indeks.
jakubka
134
Jako dodatek do odpowiedzi Yorro, można to również zrobić za pomocą atrybutów.
Przykład dla intunikalnej kombinacji klawiszy typu:
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
namespace EFIndexTest{classProgram{staticvoidMain(string[] args){
using (var context =newAppDbContext()){var newUser =newUser{UniqueKeyIntPart1=1,UniqueKeyIntPart2=1,UniqueKeyStringPart1="A",UniqueKeyStringPart2="A"};
context.UserSet.Add(newUser);
context.SaveChanges();}}}[MetadataType(typeof(UserMetadata))]publicclassUser{publicintId{get;set;}publicintUniqueKeyIntPart1{get;set;}publicintUniqueKeyIntPart2{get;set;}publicstringUniqueKeyStringPart1{get;set;}publicstringUniqueKeyStringPart2{get;set;}}publicclassUserMetadata{[Index("IX_UniqueKeyInt",IsUnique=true,Order=1)]publicintUniqueKeyIntPart1{get;set;}[Index("IX_UniqueKeyInt",IsUnique=true,Order=2)]publicintUniqueKeyIntPart2{get;set;}[Index("IX_UniqueKeyString",IsUnique=true,Order=1)][MaxLength(50)]publicstringUniqueKeyStringPart1{get;set;}[Index("IX_UniqueKeyString",IsUnique=true,Order=2)][MaxLength(50)]publicstringUniqueKeyStringPart2{get;set;}}publicclassAppDbContext:DbContext{publicvirtualDbSet<User>UserSet{get;set;}}}
Nie, jeśli chcesz całkowicie oddzielić swój model domeny od problemów związanych z pamięcią masową.
Rickard Liljeberg
4
Musisz także upewnić się, że masz odniesienie do EntityFramework
Michael Tranchida
2
Bądź miły, jeśli atrybut Index został oddzielony od Entity Framework, abym mógł uwzględnić go w moim projekcie Modele. Rozumiem, że jest to problem z pamięcią masową, ale głównym powodem, dla którego go używam, jest nałożenie unikalnych ograniczeń na takie rzeczy, jak UserNames i Role Names.
Sam
2
Nie można go znaleźć w EF7 - DNX
Shimmy Weitzhandler
4
Działa to tylko wtedy, gdy ograniczysz również długość łańcucha, ponieważ SQL nie pozwala na użycie nvarchar (max) jako klucza.
JMK
17
Oto metoda rozszerzenia pozwalająca na płynniejsze ustawianie unikalnych indeksów:
Odpowiedź @ coni2k jest poprawna, jednak musisz dodać [StringLength]atrybut, aby działał, w przeciwnym razie otrzymasz niepoprawny kluczowy wyjątek (przykład poniżej).
IndexAnnotation.AnnotationName
new IndexAttribute() { IsUnique = true }
. W przeciwnym razie tworzy tylko zwykły (nieunikalny) indeks.Jako dodatek do odpowiedzi Yorro, można to również zrobić za pomocą atrybutów.
Przykład dla
int
unikalnej kombinacji klawiszy typu:Jeśli typ danych to
string
,MaxLength
należy dodać atrybut:Jeśli istnieje problem z rozdzieleniem domeny / modelu pamięci, użycie
Metadatatype
atrybutu / klasy może być opcją: https://msdn.microsoft.com/en-us/library/ff664465%28v=pandp.50%29.aspx?f= 255 i MSPPError = -2147217396Przykład szybkiej aplikacji na konsolę:
źródło
Oto metoda rozszerzenia pozwalająca na płynniejsze ustawianie unikalnych indeksów:
Stosowanie:
Wygeneruje migrację, taką jak:
Src: Tworzenie unikalnego indeksu za pomocą płynnego interfejsu API Entity Framework 6.1
źródło
Odpowiedź @ coni2k jest poprawna, jednak musisz dodać
[StringLength]
atrybut, aby działał, w przeciwnym razie otrzymasz niepoprawny kluczowy wyjątek (przykład poniżej).źródło
Niestety nie jest to obsługiwane w Entity Framework. Było to w planie działania dla EF 6, ale zostało cofnięte: Workitem 299: Unique Constraints (Unique Indexes)
źródło
źródło