2013-03-21 10 views
5

Utworzono bazę danych w SQL i utworzyłem EDMX w Visual Studio 2012. To automatycznie tworzy klasy POCO (TT). Wszystko wygląda dobrze.Klasa POCO w EF nie działa zgodnie z oczekiwaniami

Teraz zmieniam nazwę kolumny tabeli. Aktualizuję EDMX. Otwieranie EDMX w XML i wszystko wygląda dobrze.

Pytanie 1

Po wpadłem niestandardowe narzędzie w TT, widzę, że to nowy obiekt został stworzony dodatkowo, np:

SQL table name : Student 

Column name : sName 

w moim POCO klasy

public int sName{ get; set; } 

został automatycznie utworzony.

Teraz mogę zmienić nazwę kolumny w SQL do

Column name : studentName 

mojej klasy POCO

public int sName{ get; set; } 

public int studentName{ get; set; } 

Jest to błąd, czy trzeba coś zrobić, aby rozwiązać ten problem?

Co należy zrobić, aby tego uniknąć?

Pytanie 2

Również, jeśli mogę zmienić typ danych dowolnej kolumny SQL i aktualizacji modelu z DB w moim projektanta EDMX, koncepcyjnego modelu nie jest aktualizowana. Jak mam to zrobić?

Odpowiedz

25

Po pierwsze, aby zrozumieć problem, co trzeba wiedzieć, że plik EDMX jest tylko plik XML, który zawiera 3 różne sekcje:

  • CSDL: schemat pojęciowy języka definicja
  • SSDL: Przechowywać definicja schematu język
  • MSL: specyfikacja Mapowanie język

CSDL zawiera żywe i relacje, które tworzą koncepcyjny Model. SSDL opisuje twój model DB, a MSL jest mapą pomiędzy 2.

Proces "Aktualizuj model z DB" zaktualizuje SSDL (zmieni wszystko, co jest niezgodne z bieżącym schematem bazy danych), zmodyfikuje tylko CSDL w przypadku, gdy dodałeś nowe rzeczy do swojego schematu DB.

Jest to dość normalne zachowanie, ponieważ schemat Konceptualny może/powinien różnić się od schematu DB (chyba że chcesz, aby Twój model Domeny wyglądał dokładnie tak, jak model DB, który oczywiście nie brzmi jak najlepsza praktyka OOP/DDD).

Jeśli chodzi o @Peru, rozwiązaniem byłoby usunięcie danego obiektu (nie całego EDMX!), A następnie wykonanie procesu "Aktualizuj model z bazy danych".

Mam nadzieję, że to pomoże!

Edit:

Jest narzędziem, a nie za darmo, co jest Visual Studio plugin, który pozwala zastosować zmiany wprowadzone do DB, zarówno na CSDL i plików SSDL: Huagati DBML/EDMX Tools. Jedynym "wolnym" rozwiązaniem jest usunięcie encji (lub odpowiedniego pola w tym podmiocie), która wymaga aktualizacji.

Pamiętaj, że program CSDL powinien być obsługiwany przez programistów i musi wyglądać jak model obiektowy, a nie model bazy danych. Wyobraź sobie, że masz ustawione dziedzictwo między twoimi jednostkami lub że podzieliłeś 1 tabelę DB na 2 jednostki EDMX, a "Aktualizacja modelu z DB" nie powinno nadpisywać wszystkiego!

+1

Usunięcie jednostki jest jedynym rozwiązaniem? – Peru

+0

Istnieje istniejąca wtyczka VS, która wykonuje zadanie. Edytowałem swoją odpowiedź. – MaxSC

+0

@ MaxS-Betclic: czy podasz przykład, gdy powiesz, że 'csdl musi wyglądać jak model obiektu, a nie model bazy danych' –

4

Osobiście otworzę plik edmx jako XML i znajdę węzeł problemu i go usunę. Plik jest dość łatwy do zrozumienia - nie bój się go przynajmniej wypróbować.

0

Tylko edycja ręczna została wykonana dla widoku w moim projekcie. (przejście z smallint na dziesiętny (18,2))

Otwórz plik .EDMX w edytorze tekstu, znajdź odpowiednią sekcję i ręcznie zmień wartość Property Type = "...".

Powiązane problemy