2010-10-25 19 views
8

domyślnie Entity Framework mapuje tinyint na bajt.Entity Framework: mapowanie tinyint na boolean

Próbowałem zmiany typu bazowego po tym jak został wygenerowany na Boolean, ale coraz błąd kompilacji

Mapowanie Użytkownik jest nieprawidłowy. Typ "Edm.Boolean [Nullable = False, DefaultValue =]" członka bla ...

jest to możliwe w wersji 4.0?

to nie był mój pomysł, aby użyć tinyint kolumnę jako boolean. zostało to zrobione automatycznie przez inny zespół używający hibernacji, który najwyraźniej robi to w ten sposób dla kompatybilności mysql. oczywiście tinyint ma więcej wartości niż 2. Szukam sposobu na odwzorowanie go tak, że każda akceptacja dla 1 jest fałszywa, lub wszystko, co akceptuje się jako 0, jest prawdziwe. albo zadziałałby dla mnie

czy istnieje sposób na podłączenie sortownika tekstowego do EF?

Odpowiedz

3

Od strony MSDN w sprawie integer types, widzimy, że typ tinyint oznacza liczbę całkowitą w zakresie od 0 do 255.

bool, w przeciwieństwie do tego, reprezentuje tylko binarny 0 lub 1.

Zmiana domyślnego mapowania z byte do bool (jeśli to było w ogóle możliwe, co według this page wydaje się, że to nie jest) nie ma sensu - jak, na przykład, byś reprezentowania wartości 42 (ważny tinyint) jako bool?

Jeśli potrzebujesz podmiotu z właściwością typu bool, sugeruję mapowanie go do kolumny typu bit.

+0

uzgodnione. Nienawidzę tego, że małe ints są używane do reprezentowania boolean. najwyraźniej zostało to zrobione przy użyciu hibernacji w java i to tworzy pola jako tinyint dla kompatybilności mysql. –

+3

W starszych językach każda wartość inna niż 0 była traktowana jako prawdziwa, a 0 było traktowane jako fałszywe ... więc są częściowo winne :) – Dismissile

+3

Wręcz przeciwnie, ma dużo sensu! Jeśli po prostu nie możesz zmienić schematu bazy danych (z jakichkolwiek powodów), to nie masz innej możliwości, jak tylko dostosować mapowanie. Chyba, że ​​chcesz ujawnić właściwość z semantyką boolowską jako liczbą całkowitą, która jest brzydka. – proskor

4

Faktycznie główny powód, dla którego często używane są liczby całkowite w bazie danych, wynika z faktu, że wiele silników baz danych nie pozwala na indeksy na polach bitowych. Większość silników baz danych próbuje grupować wiele bitów w jednym "wewnętrznym" bajcie w bezpieczną przestrzeń. W rezultacie pole bitowe nie jest tak naprawdę dostępne do indeksowania.

Standardem defacto jest to, że 0 jest równe false, a wszystkie inne wartości są równe true. Jednak EF nie obsługuje tego rodzaju mapowania. Najlepszą metodą jest użycie prywatnego pola cienia zadeklarowanego jako bajt odwzorowanego na EF. Po drugie utworzysz aliasową właściwość boolean, która jest używana przez twój kod.

Mapowanie właściwości prywatnych za pomocą EF wymaga kodu odbicia.

Powiązane problemy