EF 6 database first: jak zaktualizować procedury składowane?

Używamy Entity Framework 6.0.0 i najpierw używamy bazy danych (tak jak to) do generowania kodu z tabel i procedur składowanych. Wydaje się to działać świetnie, z tym wyjątkiem, że zmiany w procedurach składowanych nie są odzwierciedlane podczas aktualizacji lub odświeżania modelu. Dodanie kolumny do tabeli jest odzwierciedlane, ale nie jest dodawane pole do procedury składowanej.

Interesujące jest to, że jeśli przejdę do Model Browser, kliknij prawym przyciskiem myszy procedurę składowaną, wybierz Add Function Import i kliknij przycisk Get Column Information widzimy poprawne kolumny. Oznacza to, że model zna kolumn, ale nie potrafi zaktualizować wygenerowanego kodu.

Istnieje jedno obejście, którym jest usunięcie Wygenerowanej procedury składowanej przed aktualizacją modelu. Działa to tak długo, jak długo nie dokonano żadnych zmian w procedurze składowanej. Czy ktoś zna sposób na uniknięcie tego obejścia?

Używam Visual Studio 2013 ze wszystkimi najnowszymi aktualizacjami z początku grudnia 2013.

Dzięki w naprzód!

Aktualizacja 1: odpowiedź andersra pomogła w jednym przypadku, gdzie procedura składowana używała tymczasowej tabeli, więc dałem mu +1, ale nadal nie rozwiązuje głównego problemu aktualizacji prostych procedur składowanych.

Aktualizacja 2: komentarz shimrona poniżej linki do pytania o te same kwestie w EF 3.5. Wydaje się, że to samo dotyczy EF 6.0. Przeczytaj to dla alternatywnego sposobu robienia tego, ale mój wniosek na razie jest taki, że najprostszym sposobem robienia tego jest aby usunąć wygenerowaną procedurę składowaną przed aktualizacją modelu. Użyj klas częściowych, jeśli chcesz zrobić coś wymyślnego.

Author: Halvard, 2013-12-11

3 answers

Na podstawie tej odpowiedzi przez DaveD , Kroki te dotyczą problemu:

  1. w twoim .edmx kliknij rt i wybierz Model Browser.
  2. w przeglądarce modelu (w domyślnej konfiguracji VS 2015 jest to zakładka w Eksploratorze rozwiązań), rozwiń IMPORT funkcji pod modelem.
  3. Kliknij dwukrotnie procedurę składowaną.
  4. Kliknij przycisk Update obok zwraca kolekcję-Complex (jeśli nie zwraca Skalar lub podmiot)
  5. Kliknij okay następnie zapisz swoje .edmx, aby odzwierciedlić zmiany pól w procedurze składowanej w całym projekcie.
 83
Author: Rick V,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:05

Czy Twoje procedury przechowywane zwracają dane z tabel tymczasowych ? EF tego nie wspiera, zobacz EF4-wybrana procedura składowana nie zwraca kolumn , aby uzyskać więcej informacji.

Jednak procedura składowana będzie, jak zauważyłeś, dostępna w przeglądarce modelu. Zrobiłem szybki test przedstawiający scenariusz opisany powyżej. procedura składowana została wygenerowana w mojej klasie context, ale typem zwracanym był int, a nie złożony typ . Zobacz też powyższy link do potencjalnych obejść.

 2
Author: andersr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:10

Właśnie się na to natknąłem i moim obejściem (jest naprawdę paskudne) było stworzenie instrukcji if z warunkiem, który nigdy nie będzie prawdziwy na górze procedury składowanej, która wybiera tę samą listę wyjść, co zapytanie z wyraźnym odlewaniem do typów danych, które chcę zwrócić. To zakłada zerowość typów, więc aby rozwiązać, że zawijasz obsada w ISNULL

Na przykład, jeśli wyjście ma kolumny:

UserId (int, not null)
RoleId (int, nullable)
FirstName (varchar(255), nullable)
Created (datetime, not null)

Można by oczekiwać, że to stworzy POCO like:

SomeClass {
    public int UserId { get; set; }
    public int? RoleId { get; set; }
    public string FirstName { get; set; }
    public DateTime Created { get; set; }
}

...Ale tak nie jest i dlatego tu dziś jesteśmy. Aby obejść to nie działa zgodnie z oczekiwaniami, umieszczam następujące na górze mojego SP (zaraz po 'AS'):

if(1=0)
begin
    select
        UserId = isnull((cast(0 as int)),0),
        RoleId = cast(0 as int),
        FirstName = cast(0 as varchar),
        DateTime = isnull((cast(0 as datetime)),'')
end
Jest okropna i brzydka, ale działa na mnie za każdym razem. Miejmy nadzieję, że wkrótce otrzymamy aktualizację narzędzi, która rozwiązuje ten problem...zdarzyło mi się dzisiaj bez tabel tymczasowych w SQL Server 2016 w / VS2015...

Hope this helps somebody

 0
Author: How 'bout a Fresca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-13 03:12:40