Uložené procedury návrháře dotazu

Tento podrobný návod ukazuje, jak pomocí Návrháře entity Framework (EF Designer) importovat uložené procedury do modelu a poté volat importované uložené procedury k načtení výsledků.

Všimněte si, že Code First nepodporuje mapování na uložené procedury nebo funkce. Uložené procedury nebo funkce však můžete volat pomocí metody System.Data.Entity.DbSet.SqlQuery. Příklad:

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

Požadavky

K dokončení toho návodu budete potřebovat:

Nastavení projektu

  • Otevřete Visual Studio 2012.
  • Vybrat soubor –> Nový –> Projekt
  • V levém podokně klikněte na Visual C# a pak vyberte šablonu konzoly .
  • Jako název zadejte EFwithSProcsSample .
  • Vyberte OK.

Vytvoření modelu

  • Klikněte pravým tlačítkem myši na projekt v Průzkumník řešení a vyberte Přidat –> Nová položka.

  • V nabídce vlevo vyberte Data a pak v podokně Šablony vyberte ADO.NET Model dat entity.

  • Jako název souboru zadejte EFwithSProcsModel.edmx a klepněte na tlačítko Přidat.

  • V dialogovém okně Zvolit obsah modelu vyberte Vygenerovat z databáze a potom klepněte na tlačítko Další.

  • Klikněte na Tlačítko Nový Připojení ion.
    V dialogovém okně vlastnosti Připojení ion zadejte název serveru (například (localdb)\mssqllocaldb), vyberte metodu ověřování, jako název databáze zadejte School a klikněte na tlačítko OK.
    Dialogové okno Zvolit data Připojení ion se aktualizuje nastavením připojení k databázi.

  • V dialogovém okně Zvolit databázové objekty zaškrtněte políčko Tabulky a vyberte všechny tabulky.
    Vyberte také následující uložené procedury v uzlu Uložené procedury a funkce : GetStudentGrades a GetDepartmentName.

    Import Stored Procedures

    Od sady Visual Studio 2012 podporuje EF Designer hromadný import uložených procedur. Ve výchozím nastavení je zaškrtnuté políčko Importovat vybrané uložené procedury a funkce do modelu proentitu.

  • Klikněte na Finish (Dokončit).

Ve výchozím nastavení se tvar výsledku každé importované uložené procedury nebo funkce, která vrací více než jeden sloupec, automaticky stane novým komplexním typem. V tomto příkladu chceme namapovat výsledky funkce GetStudentGrades na entitu StudentGrade a výsledky GetDepartmentName na žádné (žádná není výchozí hodnota).

Aby funkce importu vrátila typ entity, musí sloupce vrácené odpovídající uloženou procedurou přesně odpovídat skalárním vlastnostem vráceného typu entity. Import funkce může také vracet kolekce jednoduchých typů, komplexních typů nebo bez hodnoty.

  • Klikněte pravým tlačítkem myši na návrhovou plochu a vyberte Prohlížeč modelů.
  • V prohlížeči modelů vyberte import funkcí a potom poklikejte na funkci GetStudentGrades .
  • V dialogovém okně Upravit import funkce vyberte Entity a zvolte StudentGrade.
    V horní části dialogového okna Import funkcí můžete namapovat na kompozovatelné funkce. Pokud toto políčko zaškrtnete, zobrazí se v rozevíracím seznamu Uložená procedura / Název funkce pouze kompozovatelné funkce (funkce s hodnotou tabulky). Pokud toto políčko nezaškrtnete, zobrazí se v seznamu jenom nesložitelné funkce.

Použití modelu

Otevřete soubor Program.cs, kde je definována metoda Main. Do funkce Main přidejte následující kód.

Kód volá dvě uložené procedury: GetStudentGrades (vrátí StudentGrades pro zadané StudentId) a GetDepartmentName (vrátí název oddělení ve výstupním parametru).  

    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);

    }

Zkompilujte a spusťte aplikaci. Program vytvoří následující výstup:

StudentID: 2
Student grade: 4.00
StudentID: 2
Student grade: 3.50
The department name is Engineering

Výstupní parametry

Pokud se použijí výstupní parametry, nebudou jejich hodnoty dostupné, dokud se výsledky nepřečtou úplně. Důvodem je základní chování DbDataReader, viz Načítání dat pomocí DataReader další podrobnosti.