11

Uruchamiam nową aplikację, która musi używać istniejącej bazy danych, która używa konwencji nazewnictwa, które są naprawdę denerwujące w .net (nazwy tabel zaczynają się od kilku trygramów określających domenę biznesową tabela, nazwy kolumn zaczynają się od tabel trygram, trygramy są pisane wielkimi literami i oddzielone znakami podkreślenia itp.).Zmiana nazw encji i właściwości w Database First

Chciałbym napisać prostą regułę zmiany nazwy (jest to tak proste, jak znalezienie ostatniego podkreślenia i wziąć wszystko później) i zastosować ją w Entity Framework. Naprawdę nie chcę edytować nazw jeden po drugim w edytorze, szczególnie dlatego, że baza danych może się zmienić i nie chcę tego robić kilka razy.

Używam Database First (ponieważ baza danych już istnieje i jest to "master") i EF 4.x DbContext Generator i działa naprawdę świetnie po wyjęciu z pudełka (z źle nazwanymi klasami i właściwościami) .

Edytowałem szablony T4 w celu zmiany nazwy wygenerowanych obiektów i właściwości, ale kiedy próbuję wykonać dowolne żądanie, obiekt DbContext nie może znaleźć tabeli, która pasuje do encji, której próbuję zażądać, a ja uzyskaj ten wyjątek:

Typ encji [Nazwa jednostki] nie jest częścią modelu dla bieżącego kontekstu .

Jest to oczywiste, dlaczego nie znajduje się w tabeli: nic nie mówi, jak dopasować nazwę jednostki i tabeli, jak zmieniłem go w locie. Przeczytałem, że mogę dodawać instrukcje w metodzie OnModelCreating(DbModelBuilder modelBuilder), ale nie jest to używane w Database First (a domyślny szablon T4 dodaje do niego wyjątek, na wszelki wypadek).

Więc teraz utknąłem, nie wiem jak określić to dopasowanie.

Oto kilka pomysłów mam, ale nie wiem, czy to jest poprawne, czy wykonalne:

  • Korzystanie z „mnogą/pojedyncza” API do zmiany nazwy podmiotu? Brzmi jak brudne obejście. Ale to może działać (nie próbowałem).
  • Znaleźć sposób edytowania pliku EDMX w locie.
  • Edycja EDMX później, ale może to skomplikować proces (edytować w projektancie, następnie wykonać narzędzie, aby zmienić EDMX, a następnie uruchomić niestandardowe narzędzie do regeneracji encji i DbContext ... a dziś po prostu muszę edytować w projektancie).
  • Korzystanie z kodu pierwszego (ponieważ wydaje się łatwiej używać różnych nazw obiektów niż nazw tabel, poprzez atrybuty lub instrukcje w klasie DbContext), ale wydaje się, że nie byłoby bardziej skomplikowane używanie go z istniejącą bazą danych.

Masz pomysł? Czy też coś mi umknęło?

Odpowiedz

7

Nie będzie można użyć do tego transformacji T4, ponieważ chcesz zmienić zawartość rzeczywistego pliku .edmx, aby zmapować nazwy encji sklepu (z nieprzyjemnymi przedrostkami) na nazwy oczyszczonych jednostek koncepcyjnych.

Zamiast tego, lepiej napisać aplikację, która pobiera plik .edmx jako dane wejściowe i odświeża nazwy pod znacznikiem modelu koncepcyjnego i modyfikuje nazwy odwzorowań, aby odzwierciedlały odkażone nazwy. Rozumiem, że jest to twoja trzecia opcja i chciałeś tego uniknąć, jeśli to możliwe, ale jest to najprostszy sposób, aby to osiągnąć.Pamiętaj, że musisz uruchomić to narzędzie tylko po dodaniu nowych tabel lub kolumn.

+2

Bałem się uzyskać tę odpowiedź :). Miałem nadzieję, że coś przeoczyłem. Wygląda na to, że ktoś już zrobił to narzędzie: http://blog.cincura.net/228749-making-names-of-entities-lub-ne-identifiers-in-entity-framework-model-code-and-developer-friendly -nie-wielkie / –