Uložené procedury návrháře CUD
Tento podrobný návod ukazuje, jak mapovat operace create\insert, update a delete (CUD) typu entity na uložené procedury pomocí Návrháře entity (EF Designer). Ve výchozím nastavení Entity Framework automaticky generuje příkazy SQL pro operace CUD, ale můžete také mapovat uložené procedury na tyto operace.
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]");
Důležité informace při mapování operací CUD na uložené procedury
Při mapování operací CUD na uložené procedury platí následující aspekty:
- Pokud mapujete jednu z operací CUD na uloženou proceduru, namapujte je všechny. Pokud nemapujete všechny tři, nemapované operace selžou, pokud se spustí, a vyvolá se výjimka UpdateException .
- Všechny parametry uložené procedury musíte namapovat na vlastnosti entity.
- Pokud server vygeneruje hodnotu primárního klíče pro vložený řádek, musíte tuto hodnotu namapovat zpět na vlastnost klíče entity. V následujícím příkladu vrátí uložená procedura InsertPerson nově vytvořený primární klíč jako součást sady výsledků uložené procedury. Primární klíč se mapuje na klíč entity (PersonID) pomocí< funkce Přidat vazby> výsledků v EF Designeru.
- Volání uložené procedury se mapují 1:1 s entitami v koncepčním modelu. Pokud například implementujete hierarchii dědičnosti v konceptuálním modelu a pak namapujete uložené procedury CUD pro nadřazené (základní) a podřízené (odvozené) entity, uložením podřízených změn se budou volat pouze uložené procedury podřízené, neaktivuje volání uložených procedur nadřazeného objektu.
Požadavky
K dokončení toho návodu budete potřebovat:
- Nejnovější verze sady Visual Studio.
- Ukázková databáze školy.
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 CUDSProcsSample .
- Vyberte OK.
Vytvoření modelu
Klikněte pravým tlačítkem myši na název projektu 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 CUDSProcs.edmx a klikněte na 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 v uzlu Tabulky vyberte tabulku Osoba .
Vyberte také následující uložené procedury v uzlu Uložené procedury a funkce: DeletePerson, InsertPerson a UpdatePerson.
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 entit. Vzhledem k tomu, že v tomto příkladu máme uložené procedury, které vkládají, aktualizují a odstraňují typy entit, nechceme je importovat a zrušíme zaškrtnutí tohoto políčka.
Klikněte na Finish (Dokončit). Zobrazí se návrhář EF, který poskytuje návrhovou plochu pro úpravy modelu.
Mapování entity osoby na uložené procedury
Klikněte pravým tlačítkem myši na typ entity Osoba a vyberte Mapování uložených procedur.
Mapování uložených procedur se zobrazí v okně Podrobnosti mapování .
Klepněte na tlačítko <Vybrat funkci> Vložit. Pole se stane rozevíracím seznamem uložených procedur v modelu úložiště, které lze mapovat na typy entit v konceptuálním modelu. V rozevíracím seznamu vyberte VložitPerson .
Zobrazí se výchozí mapování mezi parametry uložené procedury a vlastnostmi entity. Všimněte si, že šipky označují směr mapování: Hodnoty vlastností jsou zadány do parametrů uložené procedury.
Klikněte na <Přidat vazbu výsledku>.
Zadejte NewPersonID, název parametru vráceného uloženou procedurou InsertPerson . Nezapomeňte nezadávat úvodní nebo koncové mezery.
Stiskněte klávesu Enter.
Ve výchozím nastavení je Id novéhopersonid mapováno na klíč entity PersonID. Všimněte si, že šipka označuje směr mapování: Hodnota výsledného sloupce je zadána do vlastnosti.
Klikněte na <Vybrat funkci> Aktualizovat a z výsledného rozevíracího seznamu vyberte UpdatePerson .
Zobrazí se výchozí mapování mezi parametry uložené procedury a vlastnostmi entity.
Klikněte na <Vybrat funkci> Odstranit a z výsledného rozevíracího seznamu vyberte DeletePerson .
Zobrazí se výchozí mapování mezi parametry uložené procedury a vlastnostmi entity.
Operace vložení, aktualizace a odstranění typu entity Person se teď mapují na uložené procedury.
Pokud chcete povolit kontrolu souběžnosti při aktualizaci nebo odstranění entity s uloženými procedurami, použijte jednu z následujících možností:
- Pomocí parametru OUTPUT vrátíte počet ovlivněných řádků z uložené procedury a zaškrtněte políčko Řádky ovlivněného parametru vedle názvu parametru. Pokud vrácená hodnota je při zavolání operace nula, vyvolá se optimistická výjimka OptimisticConcurrencyException.
- Zaškrtněte políčko Použít původní hodnotu vedle vlastnosti, kterou chcete použít pro kontrolu souběžnosti. Při pokusu o aktualizaci se při zápisu dat zpět do databáze použije hodnota vlastnosti, která byla původně načtena z databáze. Pokud hodnota neodpovídá hodnotě v databázi, vyvolá se optimistická výjimka OptimisticConcurrencyException .
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 vytvoří nový objekt Person , pak objekt aktualizuje a nakonec objekt odstraní.
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);
}
- Zkompilujte a spusťte aplikaci. Program vytvoří následující výstup *
Poznámka
ID osoby je automaticky generováno serverem, takže pravděpodobně uvidíte jiné číslo*
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.
Pokud pracujete s ultimate verzí sady Visual Studio, můžete pomocí intellitrace s ladicím programem zobrazit příkazy SQL, které se spustí.