Kurz: Implementace funkcí CRUD pomocí Entity Frameworku v ASP.NET MVC

V předchozím kurzu jste vytvořili aplikaci MVC, která ukládá a zobrazuje data pomocí Entity Frameworku (EF) 6 a SQL Server LocalDB. V tomto kurzu si prohlédnete a přizpůsobíte kód CRUD (vytvoření, čtení, aktualizace, odstranění), který pro vás v řadičích a zobrazeních automaticky vytvoří generování uživatelského rozhraní MVC.

Poznámka

Běžnou praxí je implementovat vzor úložiště, aby se mezi kontrolerem a vrstvou přístupu k datům vytvořila abstraktní vrstva. Aby byly tyto kurzy jednoduché a zaměřené na výuku používání samotného EF 6, nepoužívají úložiště. Informace o implementaci úložišť najdete v mapě obsahu ASP.NET Data Access.

Tady jsou příklady webových stránek, které vytvoříte:

Snímek obrazovky se stránkou podrobností o studentech

Snímek obrazovky se stránkou pro vytvoření studenta

Snímek obrazovky se stránkou pro odstranění studentů

V tomto kurzu jste:

  • Vytvoření stránky podrobností
  • Aktualizace stránky Vytvořit
  • Aktualizace metody HttpPost Edit
  • Aktualizace stránky Odstranit
  • Zavřít databázová připojení
  • Zpracování transakcí

Požadavky

Vytvoření stránky podrobností

Vygenerovaný kód stránky Studenti Index vynechal Enrollments vlastnost, protože tato vlastnost obsahuje kolekci. Details Na stránce zobrazíte obsah kolekce v tabulce HTML.

V souboru Controllers\StudentController.cs metoda akce pro Details zobrazení používá metodu Find k načtení jedné Student entity.

public ActionResult Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Student student = db.Students.Find(id);
    if (student == null)
    {
        return HttpNotFound();
    }
    return View(student);
}

Hodnota klíče je předána metodě jako id parametr a pochází z dat trasy v hypertextovém odkazu Podrobnosti na stránce Index.

Tip: Směrování dat

Směrovací data jsou data, která modelový pořadač našel v segmentu adresy URL zadaném ve směrovací tabulce. Výchozí trasa například určuje controller, actiona id segmenty:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

Na následující adrese URL se výchozí trasa mapuje Instructor jako controller, Index jako action a 1 jako id. Jedná se o datové hodnoty trasy.

http://localhost:1230/Instructor/Index/1?courseID=2021

?courseID=2021 je hodnota řetězce dotazu. Pořadač modelu bude fungovat také v případě, že jako hodnotu řetězce dotazu předáte id hodnotu:

http://localhost:1230/Instructor/Index?id=1&CourseID=2021

Adresy URL se vytvářejí příkazy ActionLink v zobrazení Razor. V následujícím kódu id se parametr shoduje s výchozí trasou, takže id se přidá do dat trasy.

@Html.ActionLink("Select", "Index", new { id = item.PersonID  })

V následujícím kódu courseID neodpovídá parametru ve výchozí trase, takže se přidá jako řetězec dotazu.

@Html.ActionLink("Select", "Index", new { courseID = item.CourseID })

Vytvoření stránky Podrobnosti

  1. Otevřete Soubor Views\Student\Details.cshtml.

    Každé pole se zobrazí pomocí pomocné rutiny DisplayFor , jak je znázorněno v následujícím příkladu:

    <dt>
        @Html.DisplayNameFor(model => model.LastName)
    </dt>
    <dd>
        @Html.DisplayFor(model => model.LastName)
    </dd>
    
  2. EnrollmentDate Za pole a těsně před uzavírací </dl> značku přidejte zvýrazněný kód, který zobrazí seznam registrací, jak je znázorněno v následujícím příkladu:

    <dt>
                @Html.DisplayNameFor(model => model.EnrollmentDate)
            </dt>
    
            <dd>
                @Html.DisplayFor(model => model.EnrollmentDate)
            </dd>
            <dt>
                @Html.DisplayNameFor(model => model.Enrollments)
            </dt>
            <dd>
                <table class="table">
                    <tr>
                        <th>Course Title</th>
                        <th>Grade</th>
                    </tr>
                    @foreach (var item in Model.Enrollments)
                    {
                        <tr>
                            <td>
                                @Html.DisplayFor(modelItem => item.Course.Title)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.Grade)
                            </td>
                        </tr>
                    }
                </table>
            </dd>
        </dl>
    </div>
    <p>
        @Html.ActionLink("Edit", "Edit", new { id = Model.ID }) |
        @Html.ActionLink("Back to List", "Index")
    </p>
    

    Pokud je odsazení kódu po vložení chybné, naformátujte ho stisknutím kláves Ctrl+K, Ctrl+D .

    Tento kód prochází entitami ve Enrollments vlastnosti navigation. Pro každou Enrollment entitu ve vlastnosti se zobrazí název kurzu a známka. Název kurzu se načte z Course entity, která je uložená ve Course vlastnosti Enrollments navigace entity. Všechna tato data se z databáze načítají automaticky, když je potřeba. Jinými slovy, zde používáte opožděné načítání. Neurčili jste nedočkavé načítání pro Courses vlastnost navigace, takže registrace nebyly načteny ve stejném dotazu, který získal studenty. Místo toho se při prvním pokusu Enrollments o přístup k vlastnosti navigace odešle do databáze nový dotaz, který načte data. Další informace o opožděných a dychtivých načítáních si můžete přečíst v kurzu Čtení souvisejících dat dále v této sérii.

  3. Otevřete stránku Podrobnosti tak, že spustíte program (Ctrl+F5), vyberete kartu Studenti a potom kliknete na odkaz Podrobnosti pro Alexandera Carsona. (Pokud stisknete klávesu Ctrl+F5 , když je soubor Details.cshtml otevřený, zobrazí se chyba HTTP 400. Je to proto, že visual Studio se pokusí spustit stránku Podrobnosti, ale nebyla přístupná z odkazu, který určuje studenta, který má zobrazit. Pokud k tomu dojde, odeberte z adresy URL položku Student/Details a zkuste to znovu, nebo zavřete prohlížeč, klikněte pravým tlačítkem myši na projekt a klikněte na Zobrazit>zobrazení v prohlížeči.)

    Zobrazí se seznam kurzů a známek vybraného studenta.

  4. Zavřete prohlížeč.

Aktualizace stránky Vytvořit

  1. V souboru Controllers\StudentController.cs nahraďte metodu HttpPostAttributeCreate action následujícím kódem. Tento kód přidá try-catch blok a odebere z atributu BindAttribute pro vygenerovanou ID metodu:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "LastName, FirstMidName, EnrollmentDate")]Student student)
    {
        try
        {
            if (ModelState.IsValid)
            {
                db.Students.Add(student);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
        }
        catch (DataException /* dex */)
        {
            //Log the error (uncomment dex variable name and add a line here to write a log.
            ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists see your system administrator.");
        }
        return View(student);
    }
    

    Tento kód přidá entitu Student vytvořenou pořadačem modelu ASP.NET MVC do Students sady entit a pak uloží změny do databáze. Pořadač modelu odkazuje na funkci ASP.NET MVC, která usnadňuje práci s daty odeslanými formulářem; Pořadač modelu převede odeslané hodnoty formuláře na typy CLR a předá je metodě akce v parametrech. V tomto případě pořadač modelu vytvoří instanci Student entity pomocí hodnot vlastností z Form kolekce.

    Odebrali ID jste z atributu Bind, protože ID je hodnota primárního klíče, kterou SQL Server nastaví automaticky při vložení řádku. Vstup od uživatele nenastaví ID hodnotu.

    Upozornění zabezpečení – atribut ValidateAntiForgeryToken pomáhá zabránit útokům na padělání požadavků mezi weby . Vyžaduje odpovídající Html.AntiForgeryToken() příkaz v zobrazení, který uvidíte později.

    Atribut Bind je jedním ze způsobů, jak chránit před nadměrným účtováním ve scénářích vytváření. Předpokládejme například, že entita Student obsahuje Secret vlastnost, kterou nechcete nastavit na této webové stránce.

    public class Student
    {
        public int ID { get; set; }
        public string LastName { get; set; }
        public string FirstMidName { get; set; }
        public DateTime EnrollmentDate { get; set; }
        public string Secret { get; set; }
    
        public virtual ICollection<Enrollment> Enrollments { get; set; }
    }
    

    I v případě, že Secret na webové stránce nemáte pole, může hacker použít nástroj, jako je fiddler, nebo napsat javascript k publikování Secret hodnoty formuláře. BindAttribute Aniž by atribut omezoval pole, která model binder používá při vytváření Student instance, pořadač modelu by tuto hodnotu formuláře vybral Secret a použil ji k vytvoření Student instance entity. Pak se ve vaší databázi aktualizuje jakákoli hodnota, kterou hacker zadal pro Secret pole formuláře. Následující obrázek znázorňuje nástroj fiddler, který Secret přidává pole (s hodnotou OverPost) k hodnotám zaúčtovaného formuláře.

    Snímek obrazovky s kartou Composer V pravém horním rohu je spuštění zakroužkováno červeně. V pravém dolním rohu je červeně zakroužkováno pole Secret equals Over Post.

    Hodnota OverPost by pak byla úspěšně přidána do Secret vlastnosti vloženého řádku, i když jste nikdy neměli v úmyslu, aby webová stránka mohla tuto vlastnost nastavit.

    Nejlepší je použít Include parametr s atributem Bind k explicitní výpisu polí. Parametr je také možné použít Exclude k blokování polí, která chcete vyloučit. Důvodem Include je bezpečnější to, že když do entity přidáte novou vlastnost, není nové pole automaticky chráněno seznamem Exclude .

    Ve scénářích úprav můžete zabránit nadměrnému příspěvku tím, že nejprve přečtete entitu z databáze a pak zavoláte TryUpdateModela předáte explicitní seznam povolených vlastností. To je metoda používaná v těchto kurzech.

    Alternativním způsobem, jak zabránit nadměrnému příspěvku, který upřednostňuje mnoho vývojářů, je použít modely zobrazení místo tříd entit s vazbou modelu. Zahrňte pouze vlastnosti, které chcete aktualizovat v modelu zobrazení. Po dokončení pořadače modelu MVC zkopírujte vlastnosti modelu zobrazení do instance entity, volitelně pomocí nástroje, jako je AutoMapper. Použijte db. Položka v instanci entity pro nastavení jejího stavu na Nezměněno a pak nastavit Vlastnost("PropertyName"). IsModified na hodnotu true u každé vlastnosti entity, která je součástí modelu zobrazení. Tato metoda funguje ve scénářích úprav i vytváření.

    Kromě atributu Bind je blok jedinou změnou, try-catch kterou jste udělali v vygenerovaného kódu. Pokud se při ukládání změn zachytí výjimka odvozená z DataException , zobrazí se obecná chybová zpráva. DataException Výjimky jsou někdy způsobeny něčím externím pro aplikaci místo programovací chyby, takže se uživateli doporučuje, aby to zkusil znovu. I když tato ukázka není implementovaná, aplikace pro produkční kvality by výjimku protokolovala. Další informace najdete v části Protokol pro přehled v tématu Monitorování a telemetrie (vytváření Real-World cloudových aplikací s Azure).

    Kód v souboru Views\Student\Create.cshtml je podobný tomu, který jste viděli v souboru Details.cshtml s tím rozdílem, že EditorFor pomocné rutiny a ValidationMessageFor se používají pro každé pole místo .DisplayFor Tady je příslušný kód:

    <div class="form-group">
        @Html.LabelFor(model => model.LastName, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.LastName)
            @Html.ValidationMessageFor(model => model.LastName)
        </div>
    </div>
    

    Create.cshtml také obsahuje @Html.AntiForgeryToken(), který pracuje s atributem ValidateAntiForgeryToken v kontroleru a pomáhá zabránit útokům na padělání požadavků mezi weby .

    V souboru Create.cshtml nejsou vyžadovány žádné změny.

  2. Spusťte stránku tak, že spustíte program, vyberete kartu Studenti a potom kliknete na Vytvořit nový.

  3. Zadejte jména a neplatné datum a kliknutím na Vytvořit zobrazte chybovou zprávu.

    Toto je ověření na straně serveru, které získáte ve výchozím nastavení. V pozdějším kurzu se dozvíte, jak přidat atributy, které generují kód pro ověření na straně klienta. Následující zvýrazněný kód ukazuje kontrolu ověření modelu v metodě Create .

    if (ModelState.IsValid)
    {
        db.Students.Add(student);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    
  4. Změňte datum na platnou hodnotu a kliknutím na Vytvořit zobrazte nového studenta na stránce Index .

  5. Zavřete prohlížeč.

Aktualizovat metodu HttpPost Edit

  1. Nahraďte metodu HttpPostAttributeEdit action následujícím kódem:

    [HttpPost, ActionName("Edit")]
    [ValidateAntiForgeryToken]
    public ActionResult EditPost(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        var studentToUpdate = db.Students.Find(id);
        if (TryUpdateModel(studentToUpdate, "",
           new string[] { "LastName", "FirstMidName", "EnrollmentDate" }))
        {
            try
            {
                db.SaveChanges();
    
                return RedirectToAction("Index");
            }
            catch (DataException /* dex */)
            {
                //Log the error (uncomment dex variable name and add a line here to write a log.
                ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
            }
        }
        return View(studentToUpdate);
    }
    

    Poznámka

    V souboru Controllers\StudentController.csHttpGet Edit metoda (bez atributuHttpPost) používá metodu Find k načtení vybrané Student entity, jak jste viděli v Details metodě. Tuto metodu nemusíte měnit.

    Tyto změny implementují osvědčený postup zabezpečení, aby se zabránilo nadměrnému umístění. Generátor kódu vygeneroval Bind atribut a přidal entitu vytvořenou pořadačem modelu do sady entit s příznakem Modified. Tento kód se už nedoporučuje, protože Bind atribut vymaže všechna předem existující data v polích, která nejsou uvedená v parametru Include . V budoucnu se scaffolder kontroleru MVC aktualizuje tak, aby negeneroval Bind atributy pro metody Edit.

    Nový kód čte existující entitu a volá TryUpdateModel k aktualizaci polí ze vstupu uživatele v datech zaúčtovaných formulářů. Automatické sledování změn Entity Framework nastaví u entity příznak EntityState.Modified . Při volání SaveChanges metoda příznak způsobí, Modified že Entity Framework vytvoří příkazy SQL pro aktualizaci řádku databáze. Konflikty souběžnosti se ignorují a aktualizují se všechny sloupce řádku databáze, včetně těch, které uživatel nezměnil. (V pozdějším kurzu se dozvíte, jak řešit konflikty souběžnosti, a pokud chcete, aby se v databázi aktualizovala jenom jednotlivá pole, můžete entitu nastavit na EntityState.Nezměněno a jednotlivá pole nastavit na EntityState.Modified.)

    Chcete-li zabránit nadměrnému vkládání, jsou pole, která chcete aktualizovat pomocí stránky Upravit, uvedena v parametrech TryUpdateModel . V současné době nejsou k dispozici žádná další pole, která chráníte, ale výpis polí, která má pořadač modelu svázat, zajistí, že pokud do datového modelu v budoucnu přidáte pole, budou automaticky chráněná, dokud je sem explicitně nepřidáte.

    V důsledku těchto změn podpis metody HttpPost Edit metoda je stejný jako HttpGet edit metoda; Proto jste přejmenovali metodu EditPost.

    Tip

    Stavy entit a metody Attach a SaveChanges

    Kontext databáze sleduje, jestli jsou entity v paměti synchronizované s odpovídajícími řádky v databázi, a tyto informace určují, co se stane při volání SaveChanges metody . Když například předáte novou entitu metodě Add , stav této entity se nastaví na Added. Když pak zavoláte metodu SaveChanges , kontext databáze vydá příkaz SQL INSERT .

    Entita může být v jednom z následujících stavů:

    • Added. Entita ještě v databázi neexistuje. Metoda SaveChanges musí vydat INSERT příkaz .
    • Unchanged. S touto entitou není potřeba nic dělat metodou SaveChanges . Když načtete entitu z databáze, začne entita s tímto stavem.
    • Modified. Některé nebo všechny hodnoty vlastností entity byly změněny. Metoda SaveChanges musí vydat UPDATE příkaz .
    • Deleted. Entita byla označena k odstranění. Metoda SaveChanges musí vydat DELETE příkaz .
    • Detached. Entita není sledována kontextem databáze.

    V desktopové aplikaci se změny stavu obvykle nastavují automaticky. V desktopové aplikaci přečtete entitu a provedete změny některých hodnot jejích vlastností. To způsobí, že stav entity se automaticky změní na Modified. Když pak zavoláte SaveChanges, Entity Framework vygeneruje příkaz SQL UPDATE , který aktualizuje pouze skutečné vlastnosti, které jste změnili.

    Odpojená povaha webových aplikací neumožňuje tuto souvislou sekvenci. DbContext, který čte entitu, se po vykreslení stránky odstraní. HttpPostEdit Při volání metody action je proveden nový požadavek a máte novou instanci DbContext, takže musíte ručně nastavit stav entity na Modified. Pak při volání SaveChangesentity Entity Framework aktualizuje všechny sloupce řádku databáze, protože kontext nemůže zjistit, které vlastnosti jste změnili.

    Pokud chcete, aby příkaz SQL Update aktualizoval pouze pole, která uživatel skutečně změnil, můžete původní hodnoty uložit nějakým způsobem (například skrytá pole), aby byly při volání metody k dispozici HttpPostEdit . Pak můžete vytvořit entitu Student s použitím původních hodnot, volat metodu Attach s původní verzí entity, aktualizovat hodnoty entity na nové hodnoty a pak zavolat SaveChanges. volání Další informace najdete v tématech Stavy entit a SaveChanges a Local Data.

    Kód HTML a Razor v souboru Views\Student\Edit.cshtml je podobný kódu, který jste viděli v souboru Create.cshtml, a nevyžaduje se žádné změny.

  2. Spusťte stránku tak, že spustíte program, vyberete kartu Studenti a potom kliknete na hypertextový odkaz Upravit.

  3. Změňte některá data a klikněte na Uložit. Změněná data se zobrazí na stránce Index.

  4. Zavřete prohlížeč.

Aktualizace stránky Pro odstranění

Kód šablony metody HttpGetAttributeDeletev souboru Controllers\StudentController.cs používá metodu Find k načtení vybrané Student entity, jak jste viděli v Details metodách a Edit . Pokud však chcete implementovat vlastní chybovou zprávu, když volání selže SaveChanges , přidáte do této metody a jejího odpovídajícího zobrazení určité funkce.

Jak jste viděli u operací aktualizace a vytvoření, operace odstranění vyžadují dvě metody akce. Metoda, která je volána v reakci na požadavek GET, zobrazí zobrazení, které uživateli dává možnost schválit nebo zrušit operaci odstranění. Pokud ho uživatel schválí, vytvoří se žádost POST. Když k tomu dojde, HttpPostDelete zavolá se metoda a pak tato metoda skutečně provede operaci odstranění.

Do metody přidáte blokHttpPostAttributeDelete, try-catch který zpracuje případné chyby, ke kterým může dojít při aktualizaci databáze. Pokud dojde k chybě, HttpPostAttributeDelete metoda zavolá metodu HttpGetAttributeDelete a předá jí parametr, který označuje, že došlo k chybě. Metoda HttpGetAttributeDelete pak znovu zobrazí potvrzovací stránku spolu s chybovou zprávou, takže uživatel může akci zrušit nebo to zkusit znovu.

  1. Nahraďte metodu HttpGetAttributeDelete akce následujícím kódem, který spravuje zasílání zpráv o chybách:

    public ActionResult Delete(int? id, bool? saveChangesError=false)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        if (saveChangesError.GetValueOrDefault())
        {
            ViewBag.ErrorMessage = "Delete failed. Try again, and if the problem persists see your system administrator.";
        }
        Student student = db.Students.Find(id);
        if (student == null)
        {
            return HttpNotFound();
        }
        return View(student);
    }
    

    Tento kód přijímá volitelný parametr , který označuje, jestli byla metoda volána po neúspěšné uložení změn. Tento parametr je false , HttpGetDelete když je volána metoda bez předchozího selhání. Když je volána metodou HttpPostDelete v reakci na chybu aktualizace databáze, parametr je true a do zobrazení se předá chybová zpráva.

  2. Nahraďte metodu HttpPostAttributeDelete akce (s názvem DeleteConfirmed) následujícím kódem, který provede skutečnou operaci odstranění a zachytí všechny chyby aktualizace databáze.

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Delete(int id)
    {
        try
        {
            Student student = db.Students.Find(id);
            db.Students.Remove(student);
            db.SaveChanges();
        }
        catch (DataException/* dex */)
        {
            //Log the error (uncomment dex variable name and add a line here to write a log.
            return RedirectToAction("Delete", new { id = id, saveChangesError = true });
        }
        return RedirectToAction("Index");
    }
    

    Tento kód načte vybranou entitu a pak zavolá metodu Remove , která nastaví stav entity na Deleted. Při SaveChanges volání se vygeneruje příkaz SQL DELETE . Také jste změnili název metody akce z DeleteConfirmed na Delete. Vygenerovaný kód s názvem HttpPostDelete metoda DeleteConfirmed dává HttpPost metodě jedinečný podpis. (ClR vyžaduje, aby přetížené metody měly různé parametry metody.) Teď, když jsou podpisy jedinečné, můžete zůstat u konvence MVC a použít stejný název pro HttpPost metody a HttpGet delete.

    Pokud je zvýšení výkonu v aplikaci s velkým objemem prioritou, můžete se vyhnout zbytečnému dotazu SQL pro načtení řádku nahrazením řádků kódu, které volají Find metody a Remove následujícím kódem:

    Student studentToDelete = new Student() { ID = id };
    db.Entry(studentToDelete).State = EntityState.Deleted;
    

    Tento kód vytvoří Student instanci entity pouze s použitím hodnoty primárního klíče a pak nastaví stav entity na Deleted. To je vše, co Entity Framework potřebuje k odstranění entity.

    Jak jsme uvedli HttpGetDelete , metoda neodstraní data. Provedení operace odstranění v reakci na požadavek GET (nebo provedení jakékoli operace úprav, operace vytvoření nebo jiné operace, která mění data) představuje bezpečnostní riziko. Další informace najdete v tématu tip ASP.NET MVC #46 – Nepoužívejte odstranit odkazy, protože vytvářejí bezpečnostní díry na blogu Stephena Walthera.

  3. V souboru Views\Student\Delete.cshtml přidejte mezi h2 nadpis a nadpis chybovou h3 zprávu, jak je znázorněno v následujícím příkladu:

    <h2>Delete</h2>
    <p class="error">@ViewBag.ErrorMessage</p>
    <h3>Are you sure you want to delete this?</h3>
    
  4. Spusťte stránku tak, že spustíte program, vyberete kartu Studenti a potom kliknete na hypertextový odkaz Odstranit.

  5. Na stránce s textem Opravdu chcete toto odstranit, zvolte Odstranit.

    Stránka Rejstřík se zobrazí bez odstraněného studenta. (Příklad kódu pro zpracování chyb v akci uvidíte v kurzu souběžnosti.)

Zavřít databázová připojení

Pokud chcete databázová připojení zavřít a co nejdříve uvolnit prostředky, které obsahují, odstraňte instanci kontextu, jakmile s ní skončíte. Proto vygenerovaný kód poskytuje metodu Dispose na konci StudentController třídy v souboru StudentController.cs, jak je znázorněno v následujícím příkladu:

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        db.Dispose();
    }
    base.Dispose(disposing);
}

Základní Controller třída již implementuje IDisposable rozhraní, takže tento kód jednoduše přidá přepsání do Dispose(bool) metody pro explicitní odstranění instance kontextu.

Zpracování transakcí

Ve výchozím nastavení Entity Framework implicitně implementuje transakce. Ve scénářích, kdy provedete změny ve více řádcích nebo tabulkách a pak zavoláte SaveChangesmetodu , Entity Framework automaticky zajistí, že buď všechny vaše změny proběhnou úspěšně, nebo všechny selžou. Pokud jsou některé změny provedeny jako první a pak dojde k chybě, tyto změny se automaticky vrátí zpět. Scénáře, ve kterých potřebujete větší kontrolu – například pokud chcete do transakce zahrnout operace prováděné mimo Entity Framework – přečtěte si téma Práce s transakcemi.

Získání kódu

Stažení dokončeného projektu

Další materiály

Teď máte úplnou sadu stránek, které provádějí jednoduché operace CRUD pro Student entity. Použili jste pomocné rutiny MVC ke generování prvků uživatelského rozhraní pro datová pole. Další informace o pomocných rutinách MVC najdete v tématu Vykreslování formuláře pomocí pomocných rutin HTML (článek je určený pro MVC 3, ale stále platí pro MVC 5).

Odkazy na další prostředky EF 6 najdete v tématu ASP.NET Data Access – doporučené zdroje.

Další kroky

V tomto kurzu jste:

  • Vytvoření stránky s podrobnostmi
  • Aktualizovala se stránka Vytvořit.
  • Aktualizace metody HttpPost Edit
  • Stránka Odstranit se aktualizovala.
  • Uzavřený databázová připojení
  • Zpracovávané transakce

V dalším článku se dozvíte, jak do projektu přidat řazení, filtrování a stránkování.