2011-07-14 11 views
9

Mam więc DB w SQL Server, z którym łączę się i używam Entity Framework 4.1 do generowania moich klas POCO, który działa ogólnie całkiem dobrze. Istnieją również procedury składowane, w których korzystam z funkcji "import funkcji" w celu utworzenia wynikowych wierszy danych z ich wywoływania. Zasadniczo proces używam jest:Odbicie zmian wprowadzonych w procedurze przechowywanej w Entity Framework-generated complex type

  1. kliknij prawym przyciskiem myszy na Model.edmx i wybierz „funkcja importowania ...”
  2. Odbiór procedury z listy rozwijanej
  3. Wprowadź mój żądanej funkcji importu Imię
  4. kliknij "Pobierz informacje o kolumnie"
  5. Kliknij przycisk "Utwórz nowy typ złożony"
  6. Kliknij przycisk "OK"

i że będzie utworzyć klasę POCO do definicji zbioru wynikowego i mogę zrobić coś takiego:

var query = context.GetMyStuff().AsQueryable();

do pobierania wyników. To wydaje się działać dobrze.

Teraz mam kłopot, gdy próbuję zmodyfikować procedurę przechowywaną, a następnie pobrać zmiany do propagacji do mojego kodu. Na przykład dodałem dodatkową kolumnę do tabeli, a następnie zaktualizowałem procedurę przechowywaną, aby zwrócić dane tej kolumny jako część wyników. Nie widzę sposobu, aby ta aktualizacja była propagowana do funkcji importowania funkcji, to znaczy, aby wygenerowany obiekt POCO miał nową właściwość dla dodanej kolumny.

Co to jest ćwiczenie, aby ta aktualizacja procedury odzwierciedlała się po stronie C#? Czy za każdym razem będę musiał stworzyć nową klasę? Nie było dla mnie oczywiste, jak to zrobić.


Informacje dodatkowe:

Kiedy próbowałem „update” typu złożonego, jak zaproponowano w odpowiedzi Ladislav do this question, pojawia się komunikat o błędzie „Sprawdź, czy nazwa jest unikalna FunctionImport . "

Jeśli spróbuję, co E.J. Brennan sugeruje poniżej, otrzymuję ten sam komunikat o błędzie.

Co najmniej działa, przynajmniej dla mnie, aby otworzyć plik Model.edmx w Notepad ++, znaleźć wiersz FunctionImport i usunąć go, a następnie go zregenerować. To nie jest idealne, ale zadziałało.

+0

Nie jestem pewien, czy to jest to samo pytanie: http://stackoverflow.com/questions/6381423/function-import-when-sp-is-changed –

+0

@Ladislav - widziałem to, ale kiedy próbuję zrób to, otrzymuję błąd. Będę edytować moje pytanie powyżej, aby to odzwierciedlić. – itsmatt

Odpowiedz

9

Zwykle przechodzę do przeglądarki modelu, w menu głównym wybierz Widok> Inne okna> Przeglądarka danych encji jednostki (zwykle otwiera się w tym samym panelu, co Eksplorator rozwiązań) i usuń zmienioną procedurę przechowywaną, a następnie ponownie dodaj go ponownie.

Może być łatwiej, ale ten działa dla mnie.

Edycja: "Zaktualizuj model z bazy danych" teoretycznie powinien również działać, ale z mojego doświadczenia wynika, że ​​nie działa w 100% przypadków, usuwanie i ponowne dodawanie wydaje się być solidne.

+0

Dziękuję za odpowiedź - próbowałem tego, ale miałem ten sam problem, co na końcu mojego pytania. Jeśli edytuję plik .edmx bezpośrednio (xml, to jest) i usuwam ten, który próbuję zaktualizować (wiersz FunctionImport), działa, ale wydaje się to trochę niezgrabne. – itsmatt

+0

Kiedy byłeś w przeglądarce modelu, czy usunąłeś procedurę składowaną ORAZ usunąłeś funkcję importu - dwa osobne usunięcia? To działa dla mnie bezbłędnie - po prostu to potwierdziłem. –

+0

Usunąłem funkcję importu, a następnie usunąłem zapisany proces, a następnie zaktualizowałem bazę danych, która została przywrócona do usuniętego zapisanego procesu. Wykonano kliknięcie prawym przyciskiem myszy na modelu.edmx, Import funkcji, ponownie wprowadzono żądaną funkcję importu funkcji, wybrałem Proced proc z menu rozwijanego, kliknąłem przycisk get columns, kliknąłem "Create New Complex Type", co dało mi złożoną nazwę typu MyFuncImportName_Result, kliknąłem OK i otrzymałem "Sprawdź, czy nazwa FunctionImport jest unikalna." dialog. Wygląda na to, że model.edmx nadal zawiera wpis - jeśli usunę go ręcznie z xml, to wtedy zadziała. – itsmatt

1

@itsmatt - Twoje rozwiązanie zadziałało u mnie.W skrócie:

  1. Otwórz plik .edmx w edytorze tekstu.
  2. Zlokalizuj i usuń węzeł XML, który wygląda tak:
<FunctionImport Name="<some name>" ReturnType="Collection(dev_riskModel.GetECLExcesses_Result)"> 
(additional lines. . .) 
</FunctionImport> 
  1. zapisać plik
  2. W przeglądarce modelu aktualizacji modelu z bazy danych, ponowne dodanie przechowywany proc
  3. Wybierz nowo dodany zapisany proces, a następnie wybierz element "Dodaj funkcję importu" z menu kontekstowego, itp.
1

Właśnie spotkałem się z tym samym problemem i dziękuję za odpowiedź! Jeszcze jedną rzeczą, którą musiałem zrobić, było usunięcie danych wyjściowych z "Complex Types" w przeglądarce modelu.

+0

To powinno być komentarzem, a nie odpowiedzią. Wiem, że potrzebujesz więcej przedstawiciela do komentowania. – bummi

26

(to rozwiązanie jest dla EF 6. Nie próbowałem w innych wersjach EF. Działa miłe.) Popieram odpowiedź Brennan przez ilustrujący przykład, aby uczynić go bardziej jasne dla naiwnych koderów jak ja :)


Przejdź do przeglądarki modelu. MyStoreProc to nazwa procedury składowanej (jako przykład). MyStoreProc pojawi się w 3 miejscach.

  1. 1-te miejsce- Pod Complex Types-> jak MyStoreProc_result
  2. 2-cie Place- ramach przywozu Function -> jak MyStoreProc
  3. 3. miejsce - Under Przechowywane Procdures/funkcje -> jak MyStoreProc enter image description here

Usuń wszystkie trzy z modelu. Zapisz edmx (klikając w oknie, następnie ctrl + S). Następnie kliknij prawym przyciskiem myszy i kliknij zaktualizuj model z bazy danych. Następnie dodaj zaktualizowaną procedurę składowaną i ponownie zapisz.

rozwiązać bez żadnych kłopotów :)

2

W naszej firmie używane do aktualizacji SP jest jak SArifin odpowiedź ... który działa, ale to rodzaj oporu.

Niedawno dowiedzieliśmy się, że wystarczy przejść do tej funkcji importu funkcji SP -> Prawy przycisk myszy -> Edytuj -> Zaktualizuj typ złożony.

+0

Dziękuję za to, że usunąłem 3 oddzielne wystąpienia każdego SP (typu złożonego inc), ale Twoja sugestia działa i jest znacznie szybsza ... – NickGPS

Powiązane problemy