Procedury składowane kwerend projektanta
W tym przewodniku krok po kroku pokazano, jak zaimportować procedury składowane do modelu przy użyciu projektanta programu Entity Framework (EF Designer), a następnie wywołać zaimportowane procedury składowane w celu pobrania wyników.
Należy pamiętać, że funkcja Code First nie obsługuje mapowania na procedury składowane ani funkcje. Można jednak wywołać procedury składowane lub funkcje przy użyciu metody System.Data.Entity.DbSet.SqlQuery. Na przykład:
var query = context.Products.SqlQuery("EXECUTE [dbo].[GetAllProducts]")`;
Wymagania wstępne
W celu wykonania instrukcji w tym przewodniku potrzebne są następujące elementy:
- Najnowsza wersja programu Visual Studio.
- Przykładowa baza danych School.
Konfigurowanie projektu
- Otwórz program Visual Studio 2012.
- Wybieranie pozycji Plik — nowy —>> projekt
- W okienku po lewej stronie kliknij pozycję Visual C#, a następnie wybierz szablon Konsola.
- Wprowadź wartość EFwithSProcsSample jako nazwę.
- Wybierz przycisk OK.
Tworzenie modelu
Kliknij prawym przyciskiem myszy projekt w Eksplorator rozwiązań i wybierz polecenie Dodaj —> nowy element.
Wybierz pozycję Dane z menu po lewej stronie, a następnie wybierz pozycję ADO.NET Model danych jednostki w okienku Szablony.
Wprowadź wartość EFwithSProcsModel.edmx jako nazwę pliku, a następnie kliknij przycisk Dodaj.
W oknie dialogowym Wybieranie zawartości modelu wybierz pozycję Generuj z bazy danych, a następnie kliknij przycisk Dalej.
Kliknij pozycję Nowe połączenie.
W oknie dialogowym Właściwości połączenia wprowadź nazwę serwera (na przykład (localdb)\mssqllocaldb), wybierz metodę uwierzytelniania, wpisz School jako nazwę bazy danych, a następnie kliknij przycisk OK.
Okno dialogowe Wybieranie połączenia danych zostanie zaktualizowane przy użyciu ustawienia połączenia z bazą danych.W oknie dialogowym Wybieranie obiektów bazy danych zaznacz pole wyboru Tabele , aby zaznaczyć wszystkie tabele.
Ponadto wybierz następujące procedury składowane w węźle Procedury składowane i funkcje : GetStudentGrades i GetDepartmentName.Począwszy od programu Visual Studio 2012 projektant EF Designer obsługuje zbiorcze importowanie procedur składowanych. Importowanie wybranych procedur składowanych i funkcji do modelu jednostki jest domyślnie sprawdzane.
Kliknij przycisk Zakończ.
Domyślnie kształt wyniku każdej zaimportowanej procedury składowanej lub funkcji, która zwraca więcej niż jedną kolumnę, automatycznie stanie się nowym typem złożonym. W tym przykładzie chcemy zamapować wyniki funkcji GetStudentGrades na jednostkę StudentGrade i wyniki getDepartmentName na wartość none (żadna nie jest wartością domyślną).
Aby import funkcji zwrócił typ jednostki, kolumny zwrócone przez odpowiednią procedurę składowaną muszą dokładnie odpowiadać właściwościom skalarnym zwracanego typu jednostki. Import funkcji może również zwracać kolekcje prostych typów, typów złożonych lub bez wartości.
- Kliknij prawym przyciskiem myszy powierzchnię projektową i wybierz pozycję Przeglądarka modelu.
- W przeglądarce modelu wybierz pozycję Importy funkcji, a następnie kliknij dwukrotnie funkcję GetStudentGrades .
- W oknie dialogowym Edytowanie importu funkcji wybierz pozycję Jednostki i wybierz pozycję StudentGrade.
Pole wyboru Importowanie funkcji jest możliwe do komponowania w górnej części okna dialogowego Importy funkcji, dzięki którym można mapować funkcje do komponowania. Jeśli to pole wyboru zostanie zaznaczone, na liście rozwijanej Procedura składowana/Nazwa funkcji będą wyświetlane tylko funkcje komponowalne (Funkcje z wartością tabeli). Jeśli to pole nie zostanie zaznaczone, na liście będą wyświetlane tylko funkcje niezwiązane z komponami.
Korzystanie z modelu
Otwórz plik Program.cs, w którym zdefiniowano metodę Main. Dodaj następujący kod do funkcji Main.
Kod wywołuje dwie procedury składowane: GetStudentGrades (zwraca studentGrades dla określonego identyfikatora StudentId) i GetDepartmentName (zwraca nazwę działu w parametrze wyjściowym).
using (SchoolEntities context = new SchoolEntities())
{
// Specify the Student ID.
int studentId = 2;
// Call GetStudentGrades and iterate through the returned collection.
foreach (StudentGrade grade in context.GetStudentGrades(studentId))
{
Console.WriteLine("StudentID: {0}\tSubject={1}", studentId, grade.Subject);
Console.WriteLine("Student grade: " + grade.Grade);
}
// Call GetDepartmentName.
// Declare the name variable that will contain the value returned by the output parameter.
ObjectParameter name = new ObjectParameter("Name", typeof(String));
context.GetDepartmentName(1, name);
Console.WriteLine("The department name is {0}", name.Value);
}
Skompiluj i uruchom aplikację. Program generuje następujące dane wyjściowe:
StudentID: 2
Student grade: 4.00
StudentID: 2
Student grade: 3.50
The department name is Engineering
Parametry wyjściowe
Jeśli są używane parametry wyjściowe, ich wartości nie będą dostępne do czasu całkowitego odczytania wyników. Jest to spowodowane podstawowym zachowaniem elementu DbDataReader, zobacz Pobieranie danych przy użyciu elementu DataReader , aby uzyskać więcej szczegółów.