Sdílet prostřednictvím


Pokročilé scénáře entity Framework pro webovou aplikaci MVC (10 z 10)

Tom Dykstra

Ukázková webová aplikace Contoso University ukazuje, jak vytvářet aplikace ASP.NET MVC 4 pomocí entity Framework 5 Code First a sady Visual Studio 2012. Informace o sérii kurzů najdete v prvním kurzu série.

Poznámka:

Pokud narazíte na problém, který nemůžete vyřešit, stáhněte si dokončenou kapitolu a zkuste problém reprodukovat. Obecně můžete najít řešení problému porovnáním kódu s dokončeným kódem. Informace o některých běžných chybách a jejich řešení najdete v tématu Chyby a alternativní řešení.

V předchozím kurzu jste implementovali úložiště a jednotku pracovních vzorů. Tento kurz se zabývá následujícími tématy:

  • Provádění nezpracovaných dotazů SQL
  • Provádění dotazů bez sledování
  • Zkoumání dotazů odeslaných do databáze
  • Práce s třídami proxy.
  • Zakázání automatické detekce změn
  • Zakázání ověření při ukládání změn
  • Chyby a alternativní řešení

U většiny těchto témat budete pracovat se stránkami, které jste už vytvořili. Pokud chcete použít nezpracovaný SQL k hromadné aktualizaci, vytvoříte novou stránku, která aktualizuje počet kreditů všech kurzů v databázi:

Snímek obrazovky s úvodní stránkou Aktualizace kreditů kurzu Do textového pole je zadáno číslo 2.

Pokud chcete použít dotaz bez sledování, přidáte na stránku Pro úpravy oddělení novou logiku ověření:

Snímek obrazovky znázorňující stránku Upravit oddělení univerzity Contoso s chybovou zprávou duplicitního správce

Provádění nezpracovaných dotazů SQL

Rozhraní API Entity Framework Code First obsahuje metody, které umožňují předávat příkazy SQL přímo do databáze. Máte tyto možnosti:

  • Použijte metodu DbSet.SqlQuery pro dotazy, které vracejí typy entit. Vrácené objekty musí být typu očekávaného DbSet objektem a jsou automaticky sledovány kontextem databáze, pokud sledování nevypnete. (Viz následující část o AsNoTracking metodě.)
  • Použijte metodu Database.SqlQuery pro dotazy, které vracejí typy, které nejsou entitami. Vrácená data nejsou sledována kontextem databáze, i když tuto metodu používáte k načtení typů entit.
  • Pro příkazy bez dotazu použijte Database.ExecuteSqlCommand.

Jednou z výhod použití Entity Frameworku je to, že se vyhne příliš úzkému vázání kódu na konkrétní metodu ukládání dat. To uděláte tak, že pro vás vygenerujete dotazy a příkazy SQL, které vám také umožní psát je sami. Existují ale výjimečné scénáře, kdy potřebujete spouštět konkrétní dotazy SQL, které jste vytvořili ručně, a tyto metody umožňují zpracování těchto výjimek.

Stejně jako vždy platí, když spouštíte příkazy SQL ve webové aplikaci, musíte podniknout preventivní opatření k ochraně webu před útoky prostřednictvím injektáže SQL. Jedním ze způsobů, jak to udělat, je použít parametrizované dotazy, aby se zajistilo, že řetězce odeslané webovou stránkou nelze interpretovat jako příkazy SQL. V tomto kurzu použijete parametrizované dotazy při integraci uživatelského vstupu do dotazu.

Volání dotazu, který vrací entity

Předpokládejme, že chcete, GenericRepository aby třída poskytovala další flexibilitu filtrování a řazení, aniž byste museli vytvořit odvozenou třídu s dalšími metodami. Jedním ze způsobů, jak toho dosáhnout, je přidat metodu, která přijímá dotaz SQL. Potom můžete v kontroleru zadat jakýkoli druh filtrování nebo řazení, například Where klauzuli, která závisí na spojeních nebo poddotadu. V této části se dozvíte, jak takovou metodu implementovat.

Vytvořte metodu GetWithRawSql přidáním následujícího kódu do GenericRepository.cs:

public virtual IEnumerable<TEntity> GetWithRawSql(string query, params object[] parameters)
{
    return dbSet.SqlQuery(query, parameters).ToList();
}

V CourseController.cs volejte novou metodu Details z metody, jak je znázorněno v následujícím příkladu:

public ActionResult Details(int id)
{
    var query = "SELECT * FROM Course WHERE CourseID = @p0";
    return View(unitOfWork.CourseRepository.GetWithRawSql(query, id).Single());
}

V tomto případě jste mohli použít metodu GetByID , ale používáte metodu GetWithRawSql k ověření, že GetWithRawSQL tato metoda funguje.

Spuštěním stránky Podrobnosti ověřte, že výběrový dotaz funguje (vyberte kartu Kurz a pak podrobnosti pro jeden kurz).

Snímek obrazovky se stránkou Podrobnosti o univerzitě Contoso

Volání dotazu, který vrací jiné typy objektů

Dříve jste vytvořili mřížku statistiky studenta pro stránku O aplikaci, která zobrazovala počet studentů pro každé datum registrace. Kód, který to dělá v HomeController.cs používá LINQ:

var data = from student in db.Students
           group student by student.EnrollmentDate into dateGroup
           select new EnrollmentDateGroup()
           {
               EnrollmentDate = dateGroup.Key,
               StudentCount = dateGroup.Count()
           };

Předpokládejme, že chcete napsat kód, který načítá tato data přímo v SQL, a ne pomocí LINQ. K tomu je potřeba spustit dotaz, který vrací něco jiného než objekty entity, což znamená, že je potřeba použít metodu Database.SqlQuery .

V HomeController.cs nahraďte příkaz LINQ v About metodě následujícím kódem:

var query = "SELECT EnrollmentDate, COUNT(*) AS StudentCount "
    + "FROM Person "
    + "WHERE EnrollmentDate IS NOT NULL "
    + "GROUP BY EnrollmentDate";
var data = db.Database.SqlQuery<EnrollmentDateGroup>(query);

Spusťte stránku O aplikaci. Zobrazí stejná data, která předtím udělala.

Snímek obrazovky se stránkou Contoso University About

Volání aktualizačního dotazu

Předpokládejme, že správci Contoso University chtějí mít v databázi možnost provádět hromadné změny, například změnit počet kreditů pro každý kurz. Pokud má univerzita velký počet kurzů, bylo by neefektivní je načíst všechny jako entity a změnit je jednotlivě. V této části implementujete webovou stránku, která uživateli umožní určit faktor, podle kterého se má změnit počet kreditů pro všechny kurzy, a provedete změnu spuštěním příkazu SQL UPDATE . Webová stránka bude vypadat jako na následujícím obrázku:

Snímek obrazovky znázorňující úvodní stránku Aktualizace kreditů kurzu Do textového pole je zadáno číslo 2.

V předchozím kurzu jste použili obecné úložiště ke čtení a aktualizaci Course entit v Course kontroleru. Pro tuto operaci hromadné aktualizace je potřeba vytvořit novou metodu úložiště, která není v obecném úložišti. Uděláte to tak, že vytvoříte vyhrazenou CourseRepository třídu, která je odvozena od GenericRepository třídy.

Ve složce DAL vytvořte CourseRepository.cs a nahraďte stávající kód následujícím kódem:

using System;
using ContosoUniversity.Models;

namespace ContosoUniversity.DAL
{
    public class CourseRepository : GenericRepository<Course>
    {
        public CourseRepository(SchoolContext context)
            : base(context)
        {
        }

        public int UpdateCourseCredits(int multiplier)
        {
            return context.Database.ExecuteSqlCommand("UPDATE Course SET Credits = Credits * {0}", multiplier);
        }

    }
}

V UnitOfWork.cs změňte Course typ úložiště na GenericRepository<Course>CourseRepository:

private CourseRepository courseRepository;
public CourseRepository CourseRepository
{
    get
    {

        if (this.courseRepository == null)
        {
            this.courseRepository = new CourseRepository(context);
        }
        return courseRepository;
    }
}

Do CourseController.cs přidejte metodu UpdateCourseCredits :

public ActionResult UpdateCourseCredits(int? multiplier)
{
    if (multiplier != null)
    {
        ViewBag.RowsAffected = unitOfWork.CourseRepository.UpdateCourseCredits(multiplier.Value);
    }
    return View();
}

Tato metoda bude použita pro obě HttpGet a HttpPost. HttpGet UpdateCourseCredits Při spuštění multiplier metody bude proměnná null a zobrazení zobrazí prázdné textové pole a tlačítko odeslat, jak je znázorněno na předchozím obrázku.

Po kliknutí na tlačítko Aktualizovat a spuštění HttpPost metody multiplier bude mít hodnotu zadaná do textového pole. Kód pak zavolá metodu úložiště UpdateCourseCredits , která vrátí počet ovlivněných řádků a tato hodnota je uložena v objektu ViewBag . Když zobrazení obdrží počet ovlivněných řádků v objektu ViewBag , zobrazí toto číslo místo textového pole a tlačítko odeslat, jak je znázorněno na následujícím obrázku:

Snímek obrazovky znázorňující ovlivněnou stránku s ovlivněnými řádky kreditů kurzu Pro vysokoškoláky Společnosti Contoso

Vytvořte zobrazení ve složce Views\Course pro stránku Aktualizovat kredity kurzu:

Snímek obrazovky s dialogovým oknem Přidat zobrazení Aktualizace kreditů kurzu se zadává do textového pole Název zobrazení.

V views\Course\UpdateCourseCredits.cshtml nahraďte kód šablony následujícím kódem:

@model ContosoUniversity.Models.Course

@{
    ViewBag.Title = "UpdateCourseCredits";
}

<h2>Update Course Credits</h2>

@if (ViewBag.RowsAffected == null)
{
    using (Html.BeginForm())
    {
        <p>
            Enter a number to multiply every course's credits by: @Html.TextBox("multiplier")
        </p>
        <p>
            <input type="submit" value="Update" />
        </p>
    }
}
@if (ViewBag.RowsAffected != null)
{
    <p>
        Number of rows updated: @ViewBag.RowsAffected
    </p>
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>

Spusťte metodu UpdateCourseCredits tak , že vyberete kartu Courses a pak přidáte "/UpdateCourseCredits" na konec adresy URL v adresním řádku prohlížeče (například: http://localhost:50205/Course/UpdateCourseCredits). Do textového pole zadejte číslo:

Snímek obrazovky s úvodní stránkou Aktualizovat kredity kurzu s číslem 2 zadaným v textovém poli

Klikněte na tlačítko Aktualizovat. Zobrazí se počet ovlivněných řádků:

Snímek obrazovky se stránkou Aktualizovat kredity kurzu s počtem aktualizovaných řádků

Kliknutím na Zpět na seznam zobrazíte seznam kurzů s upraveným počtem kreditů.

Snímek obrazovky znázorňující stránku Index kurzů Zobrazí se seznam kurzů s revidovaným počtem kreditů.

Další informace o nezpracovaných dotazech SQL naleznete v tématu Nezpracované dotazy SQL na blogu týmu Entity Framework.

Dotazy bez sledování

Když kontext databáze načte řádky databáze a vytvoří objekty entity, které je představují, ve výchozím nastavení sleduje, jestli jsou entity v paměti synchronizované s objekty v databázi. Data v paměti fungují jako mezipaměť a používají se při aktualizaci entity. Ukládání do mezipaměti je často ve webové aplikaci zbytečné, protože kontextové instance jsou obvykle krátkodobé (pro každý požadavek se vytvoří a odstraní nový) a kontext, který čte entitu, se obvykle odstraní před tím, než se tato entita znovu použije.

Pomocí metody můžete určit, zda kontext sleduje objekty entity pro dotaz AsNoTracking . Mezi typické scénáře, ve kterých můžete chtít provést následující:

  • Dotaz načte takový velký objem dat, který vypne sledování, může výrazně zvýšit výkon.
  • Chcete připojit entitu, abyste ji mohli aktualizovat, ale dříve jste získali stejnou entitu pro jiný účel. Vzhledem k tomu, že entita je již sledována kontextem databáze, nemůžete připojit entitu, kterou chcete změnit. Jedním ze způsobů, jak tomu zabránit, je použít AsNoTracking možnost s předchozím dotazem.

V této části implementujete obchodní logiku, která ilustruje druhou z těchto scénářů. Konkrétně vynutíte obchodní pravidlo, které říká, že instruktor nemůže být správcem více než jednoho oddělení.

V DepartmentController.cs přidejte novou metodu, kterou můžete volat z těchto Edit metod, Create abyste měli jistotu, že žádná dvě oddělení nemají stejného správce:

private void ValidateOneAdministratorAssignmentPerInstructor(Department department)
{
    if (department.PersonID != null)
    {
        var duplicateDepartment = db.Departments
            .Include("Administrator")
            .Where(d => d.PersonID == department.PersonID)
            .FirstOrDefault();
        if (duplicateDepartment != null && duplicateDepartment.DepartmentID != department.DepartmentID)
        {
            var errorMessage = String.Format(
                "Instructor {0} {1} is already administrator of the {2} department.",
                duplicateDepartment.Administrator.FirstMidName,
                duplicateDepartment.Administrator.LastName,
                duplicateDepartment.Name);
            ModelState.AddModelError(string.Empty, errorMessage);
        }
    }
}

Přidejte kód do try bloku metody, který tuto novou metodu HttpPost Edit zavolá, pokud nedojde k žádným chybám ověření. Blok try teď vypadá jako v následujícím příkladu:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(
   [Bind(Include = "DepartmentID, Name, Budget, StartDate, RowVersion, PersonID")]
    Department department)
{
   try
   {
      if (ModelState.IsValid)
      {
         ValidateOneAdministratorAssignmentPerInstructor(department);
      }

      if (ModelState.IsValid)
      {
         db.Entry(department).State = EntityState.Modified;
         db.SaveChanges();
         return RedirectToAction("Index");
      }
   }
   catch (DbUpdateConcurrencyException ex)
   {
      var entry = ex.Entries.Single();
      var clientValues = (Department)entry.Entity;

Spusťte stránku Upravit oddělení a pokuste se změnit správce oddělení na instruktora, který už je správcem jiného oddělení. Zobrazí se očekávaná chybová zpráva:

Snímek obrazovky zobrazující stránku Upravit oddělení s chybovou zprávou duplicitního správce

Teď znovu spusťte stránku Upravit oddělení a tentokrát změňte částku rozpočtu . Když kliknete na Uložit, zobrazí se chybová stránka:

Snímek obrazovky znázorňující stránku Upravit oddělení s chybovou zprávou správce stavu objektu

Chybová zpráva o výjimce je "An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key." K této chybě došlo z důvodu následující posloupnosti událostí:

  • Metoda Edit volá metodu ValidateOneAdministratorAssignmentPerInstructor , která načte všechna oddělení, která mají Kim Abercrombie jako správce. To způsobí čtení anglického oddělení. Vzhledem k tomu, že toto oddělení upravujete, nenahlásí se žádná chyba. V důsledku této operace čtení se ale entita anglického oddělení, která byla načtena z databáze, nyní sleduje kontext databáze.
  • Metoda Edit se pokusí nastavit Modified příznak entity anglického oddělení vytvořené pořadačem modelu MVC, ale to selže, protože kontext již sleduje entitu pro anglické oddělení.

Jedním z řešení tohoto problému je zachování kontextu od sledování entit oddělení v paměti načtených ověřovacím dotazem. Není to nevýhodou, protože tuto entitu nebudete aktualizovat ani ji znovu číst způsobem, který by byl přínosem pro ukládání do mezipaměti v paměti.

V DepartmentController.cs v ValidateOneAdministratorAssignmentPerInstructor metodě nezadávejte žádné sledování, jak je znázorněno v následujících příkladech:

var duplicateDepartment = db.Departments
   .Include("Administrator")
   .Where(d => d.PersonID == department.PersonID)
   .AsNoTracking()
   .FirstOrDefault();

Opakujte pokus o úpravu objemu rozpočtu oddělení. Tentokrát je operace úspěšná a web se vrátí podle očekávání na stránku Index oddělení zobrazující revidovanou hodnotu rozpočtu.

Zkoumání dotazů odeslaných do databáze

Někdy je užitečné vidět skutečné dotazy SQL, které se odesílají do databáze. Uděláte to tak, že prozkoumáte proměnnou dotazu v ladicím programu nebo zavoláte metodu ToString dotazu. Pokud si to chcete vyzkoušet, podíváte se na jednoduchý dotaz a pak se podíváte, co se s ním stane, když přidáte možnosti, jako je dychtivá načítání, filtrování a řazení.

V Controllers/CourseController nahraďte metodu Index následujícím kódem:

public ViewResult Index()
{
    var courses = unitOfWork.CourseRepository.Get();
    return View(courses.ToList());
}

Nyní nastavte zarážku v GenericRepository.cs na return query.ToList(); příkazy return orderBy(query).ToList(); Get metody. Spusťte projekt v režimu ladění a vyberte stránku Index kurzu. Když kód dosáhne zarážky, prozkoumejte proměnnou query . Zobrazí se dotaz, který se odešle na SQL Server. Jedná se o jednoduchý Select příkaz:

{SELECT 
[Extent1].[CourseID] AS [CourseID], 
[Extent1].[Title] AS [Title], 
[Extent1].[Credits] AS [Credits], 
[Extent1].[DepartmentID] AS [DepartmentID]
FROM [Course] AS [Extent1]}

Snímek obrazovky znázorňující kartu Generic Repository ukázkové webové aplikace Je vybrána proměnná dotazu.

Dotazy můžou být příliš dlouhé, aby se zobrazily v oknech ladění v sadě Visual Studio. Pokud chcete zobrazit celý dotaz, můžete zkopírovat hodnotu proměnné a vložit ji do textového editoru:

Snímek obrazovky znázorňující hodnotu proměnné s rozevírací nabídkou zobrazenou při výběru Možnost Kopírovat hodnotu je zvýrazněná.

Teď na stránku Rejstřík kurzu přidáte rozevírací seznam, aby uživatelé mohli filtrovat konkrétní oddělení. Kurzy seřadíte podle názvu a zadáte dychtivé načítání pro Department navigační vlastnost. V CourseController.cs nahraďte metodu Index následujícím kódem:

public ActionResult Index(int? SelectedDepartment)
{
    var departments = unitOfWork.DepartmentRepository.Get(
        orderBy: q => q.OrderBy(d => d.Name));
    ViewBag.SelectedDepartment = new SelectList(departments, "DepartmentID", "Name", SelectedDepartment);

    int departmentID = SelectedDepartment.GetValueOrDefault(); 
    return View(unitOfWork.CourseRepository.Get(
        filter: d => !SelectedDepartment.HasValue || d.DepartmentID == departmentID,
        orderBy: q => q.OrderBy(d => d.CourseID),
        includeProperties: "Department"));
}

Metoda obdrží vybranou hodnotu rozevíracího seznamu v parametru SelectedDepartment . Pokud není vybráno nic, bude tento parametr null.

Do SelectList zobrazení rozevíracího seznamu se předá kolekce obsahující všechna oddělení. Parametry předané konstruktoru SelectList určují název pole hodnoty, název textového pole a vybranou položku.

Get Pro metodu Course úložiště kód určuje výraz filtru, pořadí řazení a dychtivého načítání pro Department navigační vlastnost. Výraz filtru vždy vrátí true , pokud není v rozevíracím seznamu vybráno nic (to znamená SelectedDepartment , že je null).

V views\Course\Index.cshtml bezprostředně před počáteční table značku přidejte následující kód pro vytvoření rozevíracího seznamu a tlačítka odeslat:

@using (Html.BeginForm())
{
    <p>Select Department: @Html.DropDownList("SelectedDepartment","All")   
    <input type="submit" value="Filter" /></p>
}

Se zarážkou nastavenou GenericRepository ve třídě spusťte stránku Index kurzu. Pokračujte prvními dvěma časy, kdy kód dosáhne zarážky, aby se stránka zobrazila v prohlížeči. V rozevíracím seznamu vyberte oddělení a klikněte na Filtr:

Snímek obrazovky znázorňující stránku Index kurzu s vybranou možností Ekonomika oddělení

Tentokrát bude první zarážka pro dotaz oddělení na rozevírací seznam. Tuto možnost přeskočte a zobrazte query proměnnou při příštím dosažení zarážky kódu, abyste viděli, jak Course teď dotaz vypadá. Zobrazí se něco podobného:

{SELECT 
[Extent1].[CourseID] AS [CourseID], 
[Extent1].[Title] AS [Title], 
[Extent1].[Credits] AS [Credits], 
[Extent1].[DepartmentID] AS [DepartmentID], 
[Extent2].[DepartmentID] AS [DepartmentID1], 
[Extent2].[Name] AS [Name], 
[Extent2].[Budget] AS [Budget], 
[Extent2].[StartDate] AS [StartDate], 
[Extent2].[PersonID] AS [PersonID], 
[Extent2].[Timestamp] AS [Timestamp]
FROM  [Course] AS [Extent1]
INNER JOIN [Department] AS [Extent2] ON [Extent1].[DepartmentID] = [Extent2].[DepartmentID]
WHERE (@p__linq__0 IS NULL) OR ([Extent1].[DepartmentID] = @p__linq__1)}

Uvidíte, že dotaz je teď JOIN dotaz, který načítá Department data spolu s Course daty a že obsahuje klauzuli WHERE .

Práce s třídami proxy serveru

Když Entity Framework vytvoří instance entity (například při spuštění dotazu), často je vytvoří jako instance dynamicky generovaného odvozeného typu, který funguje jako proxy pro entitu. Tento proxy server přepíše některé virtuální vlastnosti entity tak, aby se při přístupu k vlastnosti automaticky vkládaly hooky pro provádění akcí. Tento mechanismus se například používá k podpoře opožděného načítání relací.

Ve většině případů nemusíte o tomto použití proxy vědět, ale existují výjimky:

  • V některých scénářích můžete chtít zabránit rozhraní Entity Framework v vytváření instancí proxy serveru. Například serializace jiných instancí než proxy instancí může být efektivnější než serializace instancí proxy.
  • Když vytvoříte instanci třídy entity pomocí operátoru new , nezískali jste instanci proxy serveru. To znamená, že nemáte funkce, jako je opožděné načítání a automatické sledování změn. To je obvykle v pořádku; Obecně nepotřebujete opožděné načítání, protože vytváříte novou entitu, která není v databázi, a obecně nepotřebujete sledování změn, pokud entitu explicitně označíte jako Added. Pokud ale potřebujete opožděné načítání a potřebujete sledování změn, můžete vytvořit nové instance entit s proxy servery pomocí Create metody DbSet třídy.
  • Možná budete chtít získat skutečný typ entity z typu proxy serveru. Metodu GetObjectType ObjectContext třídy můžete použít k získání skutečného typu entity instance typu proxy.

Další informace naleznete v tématu Práce s proxy servery na blogu týmu Entity Framework.

Zakázání automatické detekce změn

Entity Framework určuje, jak se entita změnila (a proto je potřeba do databáze odeslat aktualizace) porovnáním aktuálních hodnot entity s původními hodnotami. Původní hodnoty se ukládají při dotazování nebo připojení entity. Některé z metod, které způsobují automatickou detekci změn, jsou následující:

  • DbSet.Find
  • DbSet.Local
  • DbSet.Remove
  • DbSet.Add
  • DbSet.Attach
  • DbContext.SaveChanges
  • DbContext.GetValidationErrors
  • DbContext.Entry
  • DbChangeTracker.Entries

Pokud sledujete velký počet entit a často voláte jednu z těchto metod ve smyčce, může dojít k významným vylepšením výkonu tím, že dočasně vypnete automatickou detekci změn pomocí vlastnosti AutoDetectChangesEnabled . Další informace naleznete v tématu Automatické zjišťování změn.

Zakázání ověření při ukládání změn

Při volání SaveChanges metody ve výchozím nastavení Entity Framework ověří data ve všech vlastnostech všech změněných entit před aktualizací databáze. Pokud jste aktualizovali velký počet entit a už jste data ověřili, je tato práce zbytečná a proces uložení změn může trvat kratší dobu tím, že dočasně vypnete ověření. Můžete to provést pomocí ValidateOnSaveEnabled vlastnost. Další informace najdete v tématu Ověření.

Shrnutí

Tím se dokončí tato série kurzů o používání Entity Frameworku v aplikaci ASP.NET MVC. Odkazy na další prostředky Entity Framework najdete v mapě obsahu ASP.NET Data Accessu.

Další informace o tom, jak nasadit webovou aplikaci po jejím vytvoření, najdete v tématu ASP.NET Mapa obsahu nasazení v knihovně MSDN.

Informace o dalších tématech souvisejících s MVC, jako je ověřování a autorizace, najdete v doporučených materiálech MVC.

Poděkování

  • Tom Dykstra napsal původní verzi tohoto kurzu a je vedoucím programovacím spisovatelem v týmu obsahu Webová platforma Microsoft a Tools.
  • Rick Anderson (twitter @RickAndMSFT) spoluvytáhl tento kurz a většinu práce ho aktualizoval pro EF 5 a MVC 4. Rick je vedoucí programový spisovatel pro Microsoft, který se zaměřuje na Azure a MVC.
  • Rowan Miller a další členové týmu Entity Frameworku pomohli s revizemi kódu a pomohli ladit mnoho problémů s migrací, které vznikly během aktualizace kurzu pro EF 5.

VB

Když byl kurz původně vytvořen, poskytli jsme dokončený projekt stahování v jazyce C# i VB. V této aktualizaci poskytujeme pro každou kapitolu projekt ke stažení v jazyce C#, který usnadňuje zahájení práce kdekoli v řadě, ale vzhledem k časovým omezením a dalším prioritám, které jsme pro VB neudělali. Pokud vytvoříte projekt VB pomocí těchto kurzů a budete ochotni ho sdílet s ostatními, dejte nám vědět.

Chyby a alternativní řešení

Nejde vytvořit nebo stínová kopie

Chybová zpráva:

Pokud soubor již existuje, nelze vytvořit ani stínové kopírování DotNetOpenAuth.OpenId.

Řešení:

Počkejte několik sekund a aktualizujte stránku.

Nerozpoznaná aktualizace databáze

Chybová zpráva:

Termín Update-Database není rozpoznán jako název rutiny, funkce, souboru skriptu nebo operovatelného programu. Zkontrolujte překlepy v názvu nebo jestli byla zahrnuta cesta, ověřte, jestli je cesta správná, a zkuste to znovu.(Z Update-Database příkazu v PMC.)

Řešení:

Ukončete Visual Studio. Znovu otevřete projekt a zkuste to znovu.

Ověření se nezdařilo.

Chybová zpráva:

Ověření u jedné nebo více entit se nezdařilo. Další podrobnosti najdete v části Vlastnost EntityValidationErrors. (Z Update-Database příkazu v PMC.)

Řešení:

Jednou z příčin tohoto problému jsou chyby ověření při Seed spuštění metody. Tipy k ladění Seed metody najdete v tématu Seeding a Ladění databází Entity Framework (EF).

Chyba HTTP 500.19

Chybová zpráva:

Chyba HTTP 500.19 – Vnitřní chyba serveru
Požadovaná stránka nemůže být přístupná, protože související konfigurační data stránky jsou neplatná.

Řešení:

Jedním ze způsobů, jak se tato chyba může zobrazit, je mít více kopií řešení, přičemž každá z nich používá stejné číslo portu. Tento problém můžete obvykle vyřešit ukončením všech instancí sady Visual Studio a následným restartováním projektu, na který pracujete. Pokud to nepomůže, zkuste změnit číslo portu. Klikněte pravým tlačítkem myši na soubor projektu a potom klikněte na vlastnosti. Vyberte webovou kartu a potom změňte číslo portu v textovém poli Adresa URL projektu.

Chyba při vyhledání instance SQL Serveru

Chybová zpráva:

Při navazování připojení k SQL Serveru došlo k chybě související se sítí nebo konkrétní instancí. Server se nenašel nebo nebyl dostupný. Ověřte správnost názvu instance. Dále ověřte, jestli je SQL Server nakonfigurovaný tak, aby povoloval vzdálená připojení (Poskytovatel: Síťová rozhraní SQL, chyba: 26 – Chyba při vyhledávání zadaného serveru či instance).

Řešení:

Zkontrolujte připojovací řetězec. Pokud jste databázi odstranili ručně, změňte název databáze v řetězci konstrukce.