2015-10-07 13 views
17

Jestem nowy w EF i próbuję zrobić moje pierwsze kroki, stosując kodowanie w metodzie ETF6.0, a teraz mam problem.Jak używać właściwości String jako klucza podstawowego w Entity Framework

Mam właściwość

[Key] 
public string FooId { get; set; } 

który jest mój klucz podstawowy dla danego modelu.

Ale jeśli uruchomić komendę w konsoli menedżera pakietów

PM> Update-Database

zaktualizować do czasu migracji do bazy danych pojawia się następujący błąd:

Identity column 'FooId' must be of data type int, bigint, smallint, tinyint, or decimal or numeric with a scale of 0, and constrained to be nonnullable.

Jeśli zmienię PK w moim modelu

[Key] 
public int FooId { get; set; } 

wszystko działa poprawnie.

Ale potrzebowałbym PK, aby był ciągiem typu, ponieważ jest absolutnie sensowny w moim przypadku. Wiem, że są wady, ale dla mnie jest to konieczne.

Widziałem starszy post tutaj How to make string as primary key in entity framework!.

Ale wygląda na to, że nie rozwiążę mojego problemu lub po prostu go nie rozumiem.

Czy naprawdę nie mogę użyć ciągu znaków jako PK w bazie danych SQL?

Czy jest jakiś sposób, aby to zrobić?

+0

Kluczem jest domyślnie tożsamości, więc trzeba wyłączyć go za pomocą atrybutu '[DatabaseGenerated (DatabaseGeneratedOption.None)] 'Oznacza to, że musisz ręcznie określić klucz podczas dodawania (nie jest on generowany). – Hopeless

Odpowiedz

29

To jest właściwy sposób tworzenia PK bez Identity autoIncrement włączona:

[Key] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
public string FooId { get; set; } 
2

Jeśli potrzebujesz klucza podstawowego, aby być ciągiem znaków, nie należy go ustawiać jako kolumny tożsamości. Kolumny tożsamości wygenerują dla Ciebie kluczowe wartości klucza, które powinieneś wyłączyć, jeśli chcesz samodzielnie generować wartości.

1

Jaki jest twój powód, aby mieć ciąg jako klucz podstawowy?

Po prostu ustawiłbym klucz podstawowy na automatyczne zwiększenie liczby całkowitej i wstawiłam indeks w polu ciągu.

W ten sposób, jeśli wyszukujesz na stole, powinny one być stosunkowo szybkie, a wszystkie połączenia i normalne ustawienia nie będą miały wpływu na szybkość.

Możesz także kontrolować ilość pola, które zostanie zaindeksowane. Innymi słowy, możesz powiedzieć "zindeksuj tylko pierwszych 5 znaków", jeśli uważasz, że to wystarczy. Lub jeśli twoje dane mogą być względnie podobne, możesz indeksować całe pole.

+0

Zakładam, że jego rozumowanie było takie samo jak moje: możesz użyć obiektu .Find (fooId) od obiektu kontekstowego i zastosować buforowanie pierwszego poziomu struktury encji Używam jej dla nazwy użytkownika –

Powiązane problemy