Udostępnij za pośrednictwem


Projektant procedury składowane CUD

W tym przewodniku krok po kroku pokazano, jak mapować operacje create\insert, update i delete (CUD) typu jednostki do procedur składowanych przy użyciu Projektant Entity Framework (EF Projektant).  Domyślnie program Entity Framework automatycznie generuje instrukcje SQL dla operacji CUD, ale można również mapować procedury składowane na te operacje.  

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. Przykład:

var query = context.Products.SqlQuery("EXECUTE [dbo].[GetAllProducts]");

Zagadnienia dotyczące mapowania operacji CUD na procedury składowane

Podczas mapowania operacji CUD na procedury składowane należy wziąć pod uwagę następujące kwestie:

  • Jeśli mapujesz jedną z operacji CUD na procedurę składowaną, zamapuj je wszystkie. Jeśli nie zamapujesz wszystkich trzech, niezamapowane operacje nie powiedzą się, jeśli zostanie wykonane, a wyjątek UpdateException zostanie zgłoszony.
  • Należy zamapować każdy parametr procedury składowanej na właściwości jednostki.
  • Jeśli serwer generuje wartość klucza podstawowego dla wstawionego wiersza, musisz zamapować tę wartość z powrotem na właściwość klucza jednostki. W poniższym przykładzie procedura składowana InsertPerson zwraca nowo utworzony klucz podstawowy w ramach zestawu wyników procedury składowanej. Klucz podstawowy jest mapowany na klucz jednostki (PersonID) przy użyciu <funkcji Dodaj powiązania> wyników Projektant EF.
  • Wywołania procedury składowanej są mapowane 1:1 z jednostkami w modelu koncepcyjnym. Jeśli na przykład wdrożysz hierarchię dziedziczenia w modelu koncepcyjnym, a następnie zamapujesz procedury składowane CUD dla jednostek nadrzędnych (podstawowych) i podrzędnych (pochodnych), zapisanie zmian podrzędnych spowoduje wywołanie procedur składowanych tylko elementu podrzędnego, nie wyzwoli wywołań procedur składowanych elementu nadrzędnego.

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ź cudSProcsSample jako nazwę.
  • Wybierz przycisk OK.

Tworzenie modelu

  • Kliknij prawym przyciskiem myszy nazwę projektu w Eksplorator rozwiązań, a następnie 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ść CUDSProcs.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ę Nowy Połączenie ion. W oknie dialogowym Właściwości Połączenie ion 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łączenie danych zostanie zaktualizowane przy użyciu ustawienia połączenia z bazą danych.

  • W oknie dialogowym Wybieranie obiektów bazy danych w węźle Tabele wybierz tabelę Person .

  • Ponadto wybierz następujące procedury składowane w węźle Procedury składowane i funkcje : DeletePerson, InsertPerson i UpdatePerson.

  • Począwszy od programu Visual Studio 2012 ef Projektant obsługuje zbiorcze importowanie procedur składowanych. Importowanie wybranych procedur składowanych i funkcji do modelu jednostki jest domyślnie sprawdzane. Ponieważ w tym przykładzie mamy procedury składowane, które wstawiają, aktualizują i usuwają typy jednostek, nie chcemy ich importować i usuwamy zaznaczenie tego pola wyboru.

    Import S Procs

  • Kliknij przycisk Finish (Zakończ). Zostanie wyświetlona Projektant EF, która udostępnia powierzchnię projektową do edycji modelu.

Mapowanie jednostki osoby na procedury składowane

  • Kliknij prawym przyciskiem myszy typ jednostki Osoba i wybierz pozycję Mapowanie procedury składowanej.

  • Mapowania procedur składowanej są wyświetlane w oknie Szczegóły mapowania.

  • Kliknij pozycję <Wybierz pozycję Wstaw funkcję>. Pole staje się listą rozwijaną procedur składowanych w modelu magazynu, które można mapować na typy jednostek w modelu koncepcyjnym. Wybierz pozycję WstawPerson z listy rozwijanej.

  • Wyświetlane są domyślne mapowania między parametrami procedury składowanej i właściwościami jednostki. Zwróć uwagę, że strzałki wskazują kierunek mapowania: Wartości właściwości są dostarczane do parametrów procedury składowanej.

  • Kliknij pozycję <Dodaj powiązanie> wyników.

  • Wpisz NewPersonID, nazwę parametru zwróconego przez procedurę składowaną InsertPerson . Pamiętaj, aby nie wpisywać spacji wiodących ani końcowych.

  • Naciśnij klawisz Enter.

  • Domyślnie identyfikator NewPersonID jest mapowany na klucz jednostki PersonID. Zwróć uwagę, że strzałka wskazuje kierunek mapowania: wartość kolumny wyników jest dostarczana do właściwości .

    Mapping Details

  • Kliknij pozycję <Wybierz funkcję> aktualizacji i wybierz pozycję UpdatePerson z wyświetlonej listy rozwijanej.

  • Wyświetlane są domyślne mapowania między parametrami procedury składowanej i właściwościami jednostki.

  • Kliknij pozycję <Wybierz pozycję Usuń funkcję> i wybierz pozycję DeletePerson z wyświetlonej listy rozwijanej.

  • Wyświetlane są domyślne mapowania między parametrami procedury składowanej i właściwościami jednostki.

Operacje wstawiania, aktualizowania i usuwania typu jednostki Person są teraz mapowane na procedury składowane.

Jeśli chcesz włączyć sprawdzanie współbieżności podczas aktualizowania lub usuwania jednostki z procedurami składowanymi, użyj jednej z następujących opcji:

  • Użyj parametru OUTPUT , aby zwrócić liczbę wierszy, których dotyczy problem, z procedury składowanej i zaznacz pole wyboru Wiersze parametru, którego dotyczy problem, obok nazwy parametru. Jeśli zwracana wartość to zero po wywołaniu operacji, zostanie zwrócona wartość OptimisticConcurrencyException.
  • Zaznacz pole wyboru Użyj oryginalnej wartości obok właściwości, której chcesz użyć do sprawdzania współbieżności. Po podjęciu próby aktualizacji wartość właściwości, która została pierwotnie odczytowana z bazy danych, będzie używana podczas zapisywania danych z powrotem do bazy danych. Jeśli wartość nie jest zgodna z wartością w bazie danych, zostanie zgłoszony wyjątek OptimisticConcurrencyException .

Korzystanie z modelu

Otwórz plik Program.cs, w którym zdefiniowano metodę Main. Dodaj następujący kod do funkcji Main.

Kod tworzy nowy obiekt Person , a następnie aktualizuje obiekt, a na koniec usuwa obiekt.

    using (var context = new SchoolEntities())
    {
        var newInstructor = new Person
        {
            FirstName = "Robyn",
            LastName = "Martin",
            HireDate = DateTime.Now,
            Discriminator = "Instructor"
        }

        // Add the new object to the context.
        context.People.Add(newInstructor);

        Console.WriteLine("Added {0} {1} to the context.",
            newInstructor.FirstName, newInstructor.LastName);

        Console.WriteLine("Before SaveChanges, the PersonID is: {0}",
            newInstructor.PersonID);

        // SaveChanges will call the InsertPerson sproc.  
        // The PersonID property will be assigned the value
        // returned by the sproc.
        context.SaveChanges();

        Console.WriteLine("After SaveChanges, the PersonID is: {0}",
            newInstructor.PersonID);

        // Modify the object and call SaveChanges.
        // This time, the UpdatePerson will be called.
        newInstructor.FirstName = "Rachel";
        context.SaveChanges();

        // Remove the object from the context and call SaveChanges.
        // The DeletePerson sproc will be called.
        context.People.Remove(newInstructor);
        context.SaveChanges();

        Person deletedInstructor = context.People.
            Where(p => p.PersonID == newInstructor.PersonID).
            FirstOrDefault();

        if (deletedInstructor == null)
            Console.WriteLine("A person with PersonID {0} was deleted.",
                newInstructor.PersonID);
    }
  • Skompiluj i uruchom aplikację. Program generuje następujące dane wyjściowe *

Uwaga

Identyfikator personID jest generowany automatycznie przez serwer, więc najprawdopodobniej zobaczysz inną liczbę*

Added Robyn Martin to the context.
Before SaveChanges, the PersonID is: 0
After SaveChanges, the PersonID is: 51
A person with PersonID 51 was deleted.

Jeśli pracujesz z wersją Ultimate programu Visual Studio, możesz użyć funkcji Intellitrace z debugerem, aby wyświetlić instrukcje SQL, które są wykonywane.

Debug With Intellitrace