2013-07-11 21 views
5

Zaskoczyłem to cały ranek, ale nie mogę znaleźć odpowiedzi. Próbuję użyć EF, aby odwołać się do procedur przechowywanych, ale bez względu na to, co próbuję, nie mogę go wyświetlić w przeglądarce modelu.Entity Framework nie będzie pokazywał procedur przechowywanych.

Użyłem następujące czynności, aby spróbować dostać się do procedur modalnym:

  1. procedura Dodaj do modelu Entity

  2. prawym przyciskiem myszy na model i wybierz polecenie Dodaj nowe -> Funkcja importu

  3. Daj mu nazwę i wybrać mój procedura

  4. wygenerować nowy kompleksowy zbiór (Próbowałem również przy użyciu podmiot, ani praca)

  5. kliknij OK

Zrobiłem to wiele razy, i widzę funkcję w „import funkcja” folderu w modelu, ale nigdy nie pojawia się w modelu, więc nie mogę się do niego odwoływać.

znajdę mogę odwołać się do procedury przechowywanej bezpośrednio (bez importu), wykonując następujące czynności:

DBEntities db = new DBEntities(); 
    var test = db.gsp_GetGroups(); 

Jednak nie mogę przekonwertować to do IQueryable<T> bez dużego obejścia.

Czy ktoś wie, jakie kroki brakuje mi, aby to dodać poprawnie?

Dzięki

P.S. VS 2012, asp.net 4.0

+0

Mam ten sam problem, czy kiedykolwiek zastanawiałeś się, na czym polega problem? – Michiel

+0

W przypadku mojego projektu nie używałem EF do zapisanych procesów, ale pamiętam, jak dyskutowałem o problemie z innym programistą, a jak pamiętam, powiedział, że to problem związany z procem, który nie ma z nim powiązanego modelu. Spróbuję go dopaść i go spytać. – Limey

+0

FWIW, Zapisane wyniki proc nie mogą być dalej rozszerzane przez IQueryable po stronie serwera. Może zaistnieć potrzeba skorzystania z importu funkcji wartości tabeli, jeśli chcesz przekazać dodatkowe dane do zestawu danych. –

Odpowiedz

1

@Limey Twój problem jest prawdopodobnie spowodowany przez poziom Access dla funkcji importowania. Wypróbuj to:

W Model Browser znajdź folder Function Inports. Teraz kliknij prawym przyciskiem myszy swoją funkcję i wybierz Properties. W oknach właściwości pierwszą opcją powinna być Access zmiana na Public i zapisanie pliku model.edmx.

Wróć do kodu i sprawdź, czy to działa.

+0

Przepraszam, ale to nie jest to. Dostęp został już ustawiony na Publiczny. – Limey

7

Sprawdź, czy logowanie SQL używane do wygenerowania modelu EF ma uprawnienia do wykonywania zapisanych procesów, które próbujesz zaimportować.

  1. Przejdź do pliku App.config i znajdź wpis connectionStrings (zwykle na dole). Jeśli masz więcej niż jeden ciąg połączenia, ten, który chcesz, jest tym, którego używa twój kontekst.
    • Przejdź do pliku edmx i przejdź do dołu, aby znaleźć klasę encji.
    • Na przykład, jeśli masz MyDbModel.edmx, to pod tym numerem będzie MyDbModel.Context.tt, który z kolei będzie zawierał MyDbModel.Context.cs.
    • W pliku MyDbModel.Context.cs będziesz mieć klasę, która dziedziczy DbContext i konstruktor wezwie base("name=<your connection string name>")
    • <your connection string name> jest jednym szukasz w app.config.
  2. Twój ciąg połączenia pokazuje użytkownikowi (Integrated Security będzie oznaczać użytkownikowi AD, który jest zalogowany. To będzie działać tylko wtedy, gdy każdy, kto korzysta z programu będą miały prawidłowy dostęp DB. To może być ryzykowne założenie w sposób środowisko produkcyjne)
  3. idź do SQL Management Studio i dodać ten przechowywanej proc do „securables” użytkownika
+0

To rozwiązało mój problem. – pixelmeow

+0

Jak skomentowałem w odpowiedzi Marka, nie dawaj uprawnień do wykonania wszystkim na wszystko, jeśli możesz pomóc. Zabezpiecz swój DB, ograniczając go do określonych logowań; w tym przypadku ten, który został przypisany do modelu EF. – David

+0

To działało! dzięki –

1

może to być spowodowane Entity Framework jest podpisanie się do bazy danych za pomocą identyfikatora użytkownika, który nie ma uprawnień do wykonaj zapisane procedury.

Aby dowiedzieć się:

w twojej app.config lub pliku web.config na projekcie .NET, należy sprawdzić, które user id uzyskuje dostęp do bazy danych. Zobaczysz go po connectionString tuż po user id=.

Jeśli jest inny niż identyfikator użytkownika, który był używany do zapisu procedury przechowywanej (np. W SQL), sprawdź u administratora bazy danych, czy ten identyfikator użytkownika z .NET (iw konsekwencji Entity Framework) ma uprawnienia do wykonaj zapisane procedury.

+0

ID ma pełny dostęp do DB. – Limey

1

Miałem podobny problem, uaktualnienie z Entity Framework 5 do 6 pracowało, aby rozwiązać problem dla mnie.

Dla mnie nie wyświetlał on mojego niestandardowego schematu serwera SQL w procedurach przechowywanych, mimo że ten sam schemat był poprawnie wyświetlany w sekcji tabel.

Mam nadzieję, że to pomoże komuś innemu.

6

Przejdź do SP w Sql Server Management Studio, kliknij prawym przyciskiem myszy właściwości, przejdź do uprawnień Ustaw publicznie na Execute.

Powyższe wszystko może być odpowiedzią na problem z pozwoleniami, powyższe odpowiedzi sprawiły, że spojrzałem na przyczyny i doszedłem do tego.

+1

Należy zachować ostrożność - przyznanie publicznego wykonania może być luką w zabezpieczeniach. Lepiej po prostu przyznać określone uprawnienia logowania do SP, do których potrzebuje dostępu i na tym zostawić. – David

+1

Dobre połączenie +1. chociaż to wskazuje na problem z uprawnieniami. –

+1

Dobre miejsce, upewnij się, że przyznajesz WYKONAJ poprawną procedurę składowania I/O użytkownika.W moim przypadku skopiowałem uprawnienia EXECUTE z innego sp i go nie zmieniłem – kolin

Powiązane problemy