2010-09-29 12 views
5

Używam Entity Framework 4 z generatorem kodu POCO. Mam procedurę przechowywaną, która wykonuje INSERT i zwraca IDENTYFIKACJĘ @@ wstawionego rekordu. Próbuję zaimportować procedurę przechowywaną jako funkcję do pliku .edmx, ale mam problem z jej użyciem.Entity Framework 4 Funkcja Import nie działa

W przeglądarce modelu widzę procedurę przechowywaną pod heirarchią bazy danych, a następnie klikam prawym przyciskiem myszy i wybieram "Import funkcji ..." Próbowałem używać "Brak" jako typu zwrotu, a także Int32 (nawet jeśli jest napisane "Zbiór ..."). Ta funkcja pojawia się w obszarze Import funkcji, ale nawet po zapisaniu i kompilacji nie mogę znaleźć funkcji w moim ObjectContext. Próbowałem usunąć i ponownie zaimportować procedurę przechowywaną kilka razy bez powodzenia.

UWAGA: Mam inną procedurę zapisaną w bazie, która wykonuje proste WYBIERANIE i jest poprawnie importowana i pojawia się w kodzie ObjectContext.

Czy robię coś nie tak?

Odpowiedz

5

Jeśli procedura składowana nie zwraca zestawu wyników, więc wybierasz opcję "Zwraca kolekcję" "Brak" w oknie dialogowym "Import funkcji" w Visual Studio, wówczas import funkcji NIE jest dodawany jako metoda twój wygenerowany kontekst obiektu. (Nie udało mi się dowiedzieć, dlaczego jeszcze, ale wciąż patrzę.)

Wartość zwracana przez sproc (np. Tożsamość @@ zwrotu zwrotnego @@) nie jest tym, co rozumie się przez "Zwraca kolekcję "pytanie. Dlatego to nie zadziałało. Pytanie polega na pytaniu o to, jaki zestaw wyników wraca ze sproc.

Istnieją trzy sposoby można myślę obsługiwać problem:

  1. przywrócić wartość tożsamości za pomocą select (np select @@ tożsamość jako Identity), a następnie określić zbiór Int32 w odpowiedzi do pytania "Zwraca kolekcję".

  2. przywrócić wartość tożsamości za pomocą klauzuli wyjścia na wyciągu z wkładką i zrobić to w taki sam sposób jak w 1.

  3. Korzystanie Entity SQL i uczynić wartości tożsamości parametr wyjściowy. Oto, jak to zrobić: How to: Execute a Query Using a Stored Procedure with In and Out Parameters

Mam nadzieję, że to pomaga.

5

Na dochodzenia pliku POCO .Context.tt Znalazłem następujący kod na około linii 111

if (edmFunction.ReturnParameter == null) 
{ 
    continue; 
} 
string returnTypeElement = code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage)); 

co oznacza jakiekolwiek import funkcji, które zwracają „none” nie zostaną zapisane.

I zostały zmodyfikowane mój plik .Context.tt tak, że powyższy kod jest zastąpiony

string returnTypeElement = @""; 
if (edmFunction.ReturnParameter == null) 
{ 
    returnTypeElement = @"void"; 
} else { 
    returnTypeElement = code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage)); 
} 

I wtedy musiał dodać kilka czeków wokół deklaracji funkcji (około linii 118)

<# 
    if(returnTypeElement != "void"){ 
#> 
    <#=Accessibility.ForMethod(edmFunction)#> ObjectResult<<#=returnTypeElement#>> <#=code.Escape(edmFunction)#>(<#=paramList#>) 
<# 
    } else { 
#> 
    <#=Accessibility.ForMethod(edmFunction)#> <#=returnTypeElement#> <#=code.Escape(edmFunction)#>(<#=paramList#>) 
<# 
    } 
#> 

i oświadczenie zwrotne (około linii 142)

<# 
    if(returnTypeElement != "void"){ 
#> 
     return base.ExecuteFunction<<#=returnTypeElement#>>("<#=edmFunction.Name#>"<#=code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray()))#>); 
<# 
    } else { 
#> 
     base.ExecuteFunction("<#=edmFunction.Name#>"<#=code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray()))#>); 
<# 
    } 
#> 

To może nie jest to najbardziej eleganckie rozwiązanie (ciągi kodujące!), ale oznacza to, że mogę użyć funkcji import do moich procedur przechowywanych, które niczego nie zwracają i mają odpowiednie funkcje utworzone w pliku .Context.cs, a zatem dostępne przez Intellisense.

+0

Ładnie wykonane - działa dobrze! – BrianCooksey

Powiązane problemy