2011-07-25 10 views
9

Używam EF 4.1 CodeFirst do utworzenia mojej bazy danych. Wydaje się, że EF tworzy wszystkie podstawowe klucze z indeksem klastrowym, co nie jest optymalne dla nas w jednym przypadku (być może w większej liczbie przypadków). Czy istnieje sposób, aby powiedzieć EF, aby wygenerować tę tabelę z kluczem podstawowym jako indeks nieklastrowy?Kod EF Najpierw utwórz nieklastrowy indeks klucza podstawowego

Oczywiście moglibyśmy zrobić to ręcznie za pomocą niestandardowego skryptu po utworzeniu bazy danych, ale mamy dużo obcych kluczy wskazujących na tę tabelę, byłoby to dość nieoptymalne rozwiązanie, gdyby było lepiej, bardziej prosto do przodu, aby zrobić to samo już podczas tworzenia DB. Każda pomoc doceniona

+2

IMO dlatego właśnie wynaleziono DB First. – Tridus

+0

@Tridus, afaik Model First był "pierwszy" :) i oczywiście z modelem najpierw byłby to bułka z masłem, ale Code First ma zalety, które uważam za "ładniejsze/czystsze", choć teraz jest bardzo dalekie od doskonałości, jak widać na tym przykładzie tutaj. Nazwałbym to brakiem dotychczasowej personalizacji. – petho

+0

Jest czystszy, z wyjątkiem sytuacji, gdy nie jest. :) Dla rzeczy takich jak ten DB First jest naprawdę ładny, ponieważ po prostu robisz cokolwiek, co musisz zrobić po stronie bazy danych, następnie mów EF "hej wygeneruj trochę POCO z tego". Naprawdę nie ma powodu, dla którego EF lub kod musiałby wiedzieć cokolwiek o typie indeksów używanych po stronie serwera. – Tridus

Odpowiedz

13

Nie ma żadnego sposobu, aby kontrolować kod SQL, który pierwszy generuje - jest to kod pierwszy, a jego obecna filozofia (ta zła) to: nic nie wiesz o bazie danych i nie martwisz się.

Jedynym sposobem na zmianę tego zachowania jest napisanie inicjalizatora niestandardowej bazy danych, użycie niestandardowych zapytań do bazy danych w celu wyszukania utworzonego indeksu, usunięcia indeksu i utworzenia nowego. Niektóre referencje:

initilizer uczyni Państwa rozwiązanie zależy od konkretnego produktu serwera bazy danych.

+0

@LadislawMmka. "Moduł initilizer sprawi, że twoje rozwiązanie będzie zależne od konkretnego serwera bazy danych." - jest tak tylko w przypadku, gdy napiszesz dla konkretnego produktu. Nie ma powodu, dla którego to musi być ograniczone do konkretnego dostawcy. Myślę, że naprawdę masz na myśli "to najprawdopodobniej ...". –

9

Tak, istnieje sposób, w jaki można określić, aby nie tworzyć indeksów klastrowanych. Jeśli korzystasz z migracji kodu, plik * .cs jest generowany w celu zapełnienia bazy danych. W tym pliku można określić, oprócz klucza podstawowego dla każdej tabeli, czy należy go utworzyć z indeksami klastrowymi.

.PrimaryKey(t => t.MID, null, true) 
+1

To jest najprostszy sposób na uzyskanie nieklastrowanego indeksu w bieżącej wersji. Wymaga to korzystania z migracji kodu. – jbeanky

+0

Metoda PrimaryKey nawet nie istnieje w EF 6.1 – Triynko

+0

@triynko Zobaczysz, że jest on nazywany łańcuchem po metodzie CreateTable w pierwszej klasie migracji kodu, która jest generowana w celu utworzenia tabeli. Metoda znajduje się w klasie TableBuilder w przestrzeni nazw System.Data.Entity.Migrations.Builders. – Josh

Powiązane problemy