Sdílet prostřednictvím


Kurz: Informace o pokročilých scénářích EF pro webovou aplikaci MVC 5

V předchozím kurzu jste implementovali dědičnost tabulek na hierarchii. Tento kurz obsahuje několik témat, o která je užitečné vědět, když jdete nad rámec základů vývoje ASP.NET webových aplikací, které používají Entity Framework Code First. V prvních několika oddílech najdete podrobné pokyny, které vás provedou kódem a použitím sady Visual Studio k dokončení úkolů. Následující části představují několik témat se stručnými úvody, po kterých následují odkazy na zdroje informací.

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

Update_Course_Credits_initial_page

V tomto kurzu jste:

  • Provádění nezpracovaných dotazů SQL
  • Provádění dotazů bez sledování
  • Prozkoumání dotazů SQL odeslaných do databáze

Dozvíte se také o:

  • Vytvoření vrstvy abstrakce
  • Třídy proxy
  • Automatická detekce změn
  • Automatické ověřování
  • Entity Framework Power Tools
  • Zdrojový kód Entity Frameworku

Požadavek

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:

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

Jednou z výhod použití Entity Frameworku je, že se vyhnete příliš těsnému svázání kódu s konkrétní metodou ukládání dat. Dělá to tak, že za vás vygeneruje dotazy a příkazy SQL, což vás také osvobodí od toho, abyste je museli psát 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 vám umožní takové výjimky zpracovat.

Jak je vždy pravda při spouštění příkazů SQL ve webové aplikaci, musíte přijmout 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žití parametrizovaných dotazů, 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 vstupu uživatele do dotazu.

Volání dotazu, který vrací entity

DbSet<TEntity> Třída poskytuje metodu, kterou můžete použít ke spuštění dotazu, který vrátí entitu typu TEntity. Abyste viděli, jak to funguje, změníte kód v Details metodě Department kontroleru.

V souboru DepartmentController.cs v Details metodě nahraďte db.Departments.FindAsync volání metody voláním db.Departments.SqlQuery metody, jak je znázorněno v následujícím zvýraznění kódu:

public async Task<ActionResult> Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }

    // Commenting out original code to show how to use a raw SQL query.
    //Department department = await db.Departments.FindAsync(id);

    // Create and execute raw SQL query.
    string query = "SELECT * FROM Department WHERE DepartmentID = @p0";
    Department department = await db.Departments.SqlQuery(query, id).SingleOrDefaultAsync();
    
    if (department == null)
    {
        return HttpNotFound();
    }
    return View(department);
}

Pokud chcete ověřit, jestli nový kód funguje správně, vyberte kartu Oddělení a pak vyberte Podrobnosti pro jedno z oddělení. Ujistěte se, že se všechna data zobrazují podle očekávání.

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

Dříve jste vytvořili tabulku statistik studentů pro stránku O aplikaci, která zobrazovala počet studentů pro každé datum registrace. Kód, který to dělá v souboru 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ý tato data načte přímo v SQL, místo použití LINQ. K tomu je potřeba spustit dotaz, který vrátí něco jiného než objekty entity, což znamená, že musíte použít metodu Database.SqlQuery .

V souboru HomeController.cs nahraďte příkaz LINQ v About metodě příkazem SQL, jak ukazuje následující zvýrazněný kód:

public ActionResult About()
{
    // Commenting out LINQ to show how to do the same thing in SQL.
    //IQueryable<EnrollmentDateGroup> = from student in db.Students
    //           group student by student.EnrollmentDate into dateGroup
    //           select new EnrollmentDateGroup()
    //           {
    //               EnrollmentDate = dateGroup.Key,
    //               StudentCount = dateGroup.Count()
    //           };

    // SQL version of the above LINQ code.
    string query = "SELECT EnrollmentDate, COUNT(*) AS StudentCount "
        + "FROM Person "
        + "WHERE Discriminator = 'Student' "
        + "GROUP BY EnrollmentDate";
    IEnumerable<EnrollmentDateGroup> data = db.Database.SqlQuery<EnrollmentDateGroup>(query);

    return View(data.ToList());
}

Spusťte stránku O aplikaci. Ověřte, že se zobrazují stejná data jako předtím.

Volání aktualizačního dotazu

Předpokládejme, že správci Contoso University chtějí mít možnost provádět hromadné změny v databázi, například změnit počet kreditů pro každý kurz. Pokud má univerzita velký počet kurzů, bylo by neefektivní načíst je všechny jako entity a mě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 změnu provedete provedením příkazu SQL UPDATE .

V souboru CourseController.cs přidejte UpdateCourseCredits metody pro HttpGet a HttpPost:

public ActionResult UpdateCourseCredits()
{
    return View();
}

[HttpPost]
public ActionResult UpdateCourseCredits(int? multiplier)
{
    if (multiplier != null)
    {
        ViewBag.RowsAffected = db.Database.ExecuteSqlCommand("UPDATE Course SET Credits = Credits * {0}", multiplier);
    }
    return View();
}

Když kontroler zpracuje HttpGet požadavek, v ViewBag.RowsAffected proměnné se nic nevrátí a zobrazení zobrazí prázdné textové pole a tlačítko odeslat.

Po kliknutí na HttpPost tlačítko Aktualizovat se volá metoda a multiplier má hodnotu zadanou do textového pole. Kód pak spustí SQL, který aktualizuje kurzy a vrátí počet ovlivněných řádků do zobrazení v ViewBag.RowsAffected proměnné . Když zobrazení získá hodnotu v této proměnné, místo textového pole a tlačítka odeslat zobrazí počet aktualizovaných řádků.

V souboru CourseController.cs klikněte pravým tlačítkem na jednu z UpdateCourseCredits metod a potom klikněte na Přidat zobrazení. Zobrazí se dialogové okno Přidat zobrazení . Ponechte výchozí hodnoty a vyberte Přidat.

V souboru 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 na konec adresy URL v adresním řádku prohlížeče přidáte /UpdateCourseCredits (například). http://localhost:50205/Course/UpdateCourseCredits Do textového pole zadejte číslo:

Update_Course_Credits_initial_page_with_2_entered

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

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

Další informace o nezpracovaných dotazech SQL najdete v tématu Nezpracované dotazy SQL na webu MSDN.

Dotazy bez sledování

Když kontext databáze načte řádky tabulky a vytvoří objekty entit, 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. Toto ukládání do mezipaměti je ve webové aplikaci často zbytečné, protože instance kontextu jsou obvykle krátkodobé (pro každý požadavek se vytvoří a odstraní nová instance) a kontext, který čte entitu, se obvykle odstraní předtím, než se entita znovu použije.

Sledování objektů entit v paměti můžete zakázat pomocí metody AsNoTracking . Mezi typické scénáře, ve kterých můžete chtít provést, patří následující:

  • Dotaz načte tak velký objem dat, že vypnutí sledování může výrazně zvýšit výkon.
  • Chcete připojit entitu, abyste ji mohli aktualizovat, ale dříve jste stejnou entitu načetli 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 tuto situaci vyřešit, je použít AsNoTracking možnost s předchozím dotazem.

Příklad, který ukazuje, jak používat metodu AsNoTracking , najdete v předchozí verzi tohoto kurzu. Tato verze kurzu nenastavuje příznak Modified u entity vytvořené modelem binderu v metodě Edit, takže nepotřebuje AsNoTracking.

Prozkoumání SQL odeslaného do databáze

Někdy je užitečné vidět skutečné dotazy SQL, které se odesílají do databáze. V dřívějším kurzu jste viděli, jak to udělat v kódu zachytávacího zařízení; teď uvidíte několik způsobů, jak to udělat bez psaní kódu zachytávacího zařízení. 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 načítání, filtrování a řazení.

V části Controllers/CourseController nahraďte metodu Index následujícím kódem, abyste dočasně zastavili nedočkavé načítání:

public ActionResult Index()
{
    var courses = db.Courses;
    var sql = courses.ToString();
    return View(courses.ToList());
}

Teď nastavte zarážku na return příkaz (F9 s kurzorem na daném řádku). Stisknutím klávesy F5 spusťte projekt v režimu ladění a vyberte stránku Index kurzu. Když kód dosáhne zarážky, prozkoumejte proměnnou sql . Zobrazí se dotaz odeslaný do SQL Server. Je to jednoduché Select tvrzení.

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

Kliknutím na lupu zobrazíte dotaz ve Vizualizéru textu.

Jeden snímek obrazovky znázorňující kontroler kurzu se zvýrazněným řádkem kódu Další snímek obrazovky, který ukazuje otevřený Vizualizér textu a červeně zakroužkuje lupu v poli Hodnota.

Teď přidáte rozevírací seznam na stránku Rejstřík kurzů, aby uživatelé mohli filtrovat konkrétní oddělení. Kurzy seřadíte podle názvu a pro vlastnost navigace zadáte nedočkavé načítání Department .

V souboru CourseController.cs nahraďte metodu Index následujícím kódem:

public ActionResult Index(int? SelectedDepartment)
{
    var departments = db.Departments.OrderBy(q => q.Name).ToList();
    ViewBag.SelectedDepartment = new SelectList(departments, "DepartmentID", "Name", SelectedDepartment);
    int departmentID = SelectedDepartment.GetValueOrDefault();

    IQueryable<Course> courses = db.Courses
        .Where(c => !SelectedDepartment.HasValue || c.DepartmentID == departmentID)
        .OrderBy(d => d.CourseID)
        .Include(d => d.Department);
    var sql = courses.ToString();
    return View(courses.ToList());
}

Obnovte zarážku v příkazu return .

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

Do SelectList zobrazení pro rozevírací seznam 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.

Pro metodu GetCourse úložiště kód určuje výraz filtru, pořadí řazení a načítání Department navigační vlastnosti. Výraz filtru vždy vrátí true , pokud v rozevíracím seznamu není vybrána žádná položka (to znamená, SelectedDepartment že má hodnotu null).

V souboru 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čítko odeslat:

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

Se stále nastavenou zarážkou spusťte stránku Index kurzu. Pokračujte v prvních případech, kdy kód narazí na zarážku, aby se stránka zobrazila v prohlížeči. V rozevíracím seznamu vyberte oddělení a klikněte na Filtr.

Tentokrát bude první zarážka pro dotaz oddělení pro rozevírací seznam. Přeskočte to a zobrazte query proměnnou, až kód příště dosáhne zarážky, abyste viděli, jak Course teď dotaz vypadá. Zobrazí se něco podobného:

SELECT 
    [Project1].[CourseID] AS [CourseID], 
    [Project1].[Title] AS [Title], 
    [Project1].[Credits] AS [Credits], 
    [Project1].[DepartmentID] AS [DepartmentID], 
    [Project1].[DepartmentID1] AS [DepartmentID1], 
    [Project1].[Name] AS [Name], 
    [Project1].[Budget] AS [Budget], 
    [Project1].[StartDate] AS [StartDate], 
    [Project1].[InstructorID] AS [InstructorID], 
    [Project1].[RowVersion] AS [RowVersion]
    FROM ( 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].[InstructorID] AS [InstructorID], 
        [Extent2].[RowVersion] AS [RowVersion]
        FROM  [dbo].[Course] AS [Extent1]
        INNER JOIN [dbo].[Department] AS [Extent2] ON [Extent1].[DepartmentID] = [Extent2].[DepartmentID]
        WHERE @p__linq__0 IS NULL OR [Extent1].[DepartmentID] = @p__linq__1
    )  AS [Project1]
    ORDER BY [Project1].[CourseID] ASC

Vidíte, že dotaz je nyní dotazem JOIN , který načítá Department data společně s Course daty a že obsahuje klauzuli WHERE .

Odeberte čáru var sql = courses.ToString() .

Vytvoření vrstvy abstrakce

Mnoho vývojářů píše kód pro implementaci úložiště a pracovních vzorů jednotek jako obálka kolem kódu, který funguje s Rozhraním Entity Framework. Tyto vzory jsou určeny k vytvoření abstraktní vrstvy mezi vrstvou přístupu k datům a vrstvou obchodní logiky aplikace. Implementace těchto vzorů může pomoct izolovat vaši aplikaci od změn v úložišti dat a může usnadnit automatizované testování částí nebo vývoj řízený testy (TDD). Psaní dalšího kódu pro implementaci těchto vzorů ale není vždy tou nejlepší volbou pro aplikace, které používají EF, a to z několika důvodů:

  • Samotná třída kontextu EF izoluje váš kód od kódu specifického pro úložiště dat.
  • Třída kontextu EF může fungovat jako třída pracovní jednotky pro aktualizace databáze, které provádíte pomocí EF.
  • Funkce představené v Entity Frameworku 6 usnadňují implementaci TDD bez psaní kódu úložiště.

Další informace o implementaci úložiště a pracovních vzorů jednotek najdete ve verzi Entity Framework 5 této série kurzů. Informace o způsobech implementace TDD v Entity Frameworku 6 najdete v následujících zdrojích informací:

Třídy proxy

Když Entity Framework vytvoří instance entit (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. Podívejte se například na následující dvě image ladicího programu. Na prvním obrázku vidíte, že student proměnná je očekávaným Student typem ihned po vytvoření instance entity. Na druhém obrázku se po použití EF ke čtení entity studenta z databáze zobrazí třída proxy.

Před třídou proxy serveru

Třída proxy serveru za

Tato třída proxy přepíše některé virtuální vlastnosti entity, aby se při přístupu k vlastnosti vkládaly hooky pro automatické provádění akcí. Jednou z funkcí, pro kterou se tento mechanismus používá, je opožděné načítání.

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

  • V některých scénářích můžete chtít zabránit Entity Framework ve vytváření instancí proxy. Například při serializaci entit obecně chcete třídy POCO, nikoli třídy proxy. Jedním ze způsobů, jak se vyhnout problémům se serializací, je serializovat objekty pro přenos dat (DTO) místo objektů entit, jak je znázorněno v kurzu Použití webového rozhraní API s Rozhraním Entity Framework . Dalším způsobem je zakázání vytváření proxy serveru.
  • Když vytvoříte instanci třídy entity pomocí operátoru new , nezískáte 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 pomocí metody DbSetCreate třídy .
  • Skutečný typ entity můžete získat z typu proxy serveru. K získání skutečného typu entity instance typu proxy můžete použít metodu ObjectContextGetObjectType třídy .

Další informace najdete v tématu Práce s proxy servery na webu MSDN.

Automatická detekce změn

Entity Framework určuje, jak se entita změnila (a které aktualizace je tedy potřeba odeslat do databáze) 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. Mezi metody, které způsobují automatickou detekci změn, patří:

  • 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 voláte jednu z těchto metod mnohokrát ve smyčce, můžete dosáhnout významných vylepšení výkonu tím, že dočasně vypnete automatickou detekci změn pomocí vlastnosti AutoDetectChangesEnabled . Další informace najdete v tématu Automatické zjišťování změn na webu MSDN.

Automatické ověřování

Při volání SaveChanges metody Entity Framework ve výchozím nastavení 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 ověřili data, je tato práce zbytečná a proces uložení změn by mohl trvat kratší dobu tím, že dočasně vypnete ověřování. Můžete to provést pomocí ValidateOnSaveEnabled vlastnost. Další informace najdete v tématu Ověření na webu MSDN.

Entity Framework Power Tools

Entity Framework Power Tools je doplněk sady Visual Studio, který se použil k vytvoření diagramů datového modelu zobrazených v těchto kurzech. Nástroje mohou také provádět další funkce, například generovat třídy entit na základě tabulek v existující databázi, abyste mohli databázi používat s Code First. Po instalaci nástrojů se v kontextových nabídkách zobrazí některé další možnosti. Když například kliknete pravým tlačítkem na třídu kontextu v Průzkumník řešení, zobrazí se možnost a Entity Framework. Získáte tak možnost vygenerovat diagram. Když používáte Code First, nemůžete měnit datový model v diagramu, ale můžete ho přesouvat, aby byl srozumitelnější.

Diagram EF

Zdrojový kód Entity Frameworku

Zdrojový kód pro Entity Framework 6 je k dispozici na GitHubu. Můžete zařaďte chyby a můžete přispět vlastními vylepšeními zdrojového kódu EF.

I když je zdrojový kód otevřený, Entity Framework je plně podporovaný jako produkt Microsoftu. Tým Microsoft Entity Frameworku má kontrolu nad tím, které příspěvky se přijímají, a testuje všechny změny kódu, aby zajistil kvalitu jednotlivých verzí.

Poděkování

  • Tom Dykstra napsal původní verzi tohoto kurzu, spoluvytvářel aktualizaci EF 5 a napsal aktualizaci EF 6. Tom je vedoucí programátor v týmu obsahu Microsoft Web Platform and Tools.
  • Rick Anderson (twitter @RickAndMSFT) udělal většinu práce při aktualizaci kurzu pro EF 5 a MVC 4 a spoluvytvářel aktualizaci EF 6. Rick je vedoucí autor programování pro Microsoft, který se zaměřuje na Azure a MVC.
  • Rowan Miller a další členové týmu Entity Framework pomáhali s revizemi kódu a pomohli s laděním mnoha problémů s migracemi, ke kterým došlo při aktualizaci kurzu pro EF 5 a EF 6.

Odstraňování běžných chyb

Nelze vytvořit nebo stínová kopie

Chybová zpráva:

Nelze vytvořit stínové kopie název< souboru>, pokud soubor již existuje.

Řešení

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

Update-Database nerozpoznaná

Chybová zpráva (z Update-Database příkazu v PMC):

Termín Update-Database není rozpoznán jako název rutiny, funkce, souboru skriptu nebo funkčního programu. Zkontrolujte pravopis názvu, nebo pokud byla zahrnuta cesta, ověřte správnost cesty a zkuste to znovu.

Řešení

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

Ověření se nezdařilo.

Chybová zpráva (z Update-Database příkazu v PMC):

Ověření jedné nebo více entit se nezdařilo. Další podrobnosti najdete v tématu Vlastnost EntityValidationErrors.

Řešení

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

Chyba HTTP 500.19

Chybová zpráva:

Chyba PROTOKOLU HTTP 500.19 – Vnitřní chyba serveru: Požadovaná stránka není přístupná, protože související konfigurační data pro stránku jsou neplatná.

Řešení

Jednou z možností, jak k této chybě dojít, je mít více kopií řešení, z nichž každá používá stejné číslo portu. Tento problém můžete obvykle vyřešit ukončením všech instancí sady Visual Studio a restartováním projektu, na kterém 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 kartu Web a pak změňte číslo portu v textovém poli Adresa URL projektu .

Při hledání instance SQL Server došlo k chybě

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 ve stavebním řetězci.

Získání kódu

Stáhnout dokončený projekt

Další materiály

Další informace o tom, jak pracovat s daty pomocí Entity Frameworku, najdete na stránce dokumentace EF na webu MSDN a ASP.NET Přístup k datům – doporučené zdroje informací.

Další informace o tom, jak nasadit webovou aplikaci po vytvoření, najdete v tématu ASP.NET Nasazení webu – doporučené zdroje informací v knihovně MSDN.

Informace o dalších tématech souvisejících s MVC, jako je ověřování a autorizace, najdete v tématu ASP.NET MVC – doporučené zdroje informací.

Další kroky

V tomto kurzu jste:

  • Provádění nezpracovaných dotazů SQL
  • Provedly se dotazy bez sledování.
  • Prozkoumání dotazů SQL odeslaných do databáze

Dozvěděli jste se také o:

  • Vytvoření vrstvy abstrakce
  • Třídy proxy
  • Automatická detekce změn
  • Automatické ověřování
  • Entity Framework Power Tools
  • Zdrojový kód Entity Frameworku

Tím se dokončí tato série kurzů o používání Entity Frameworku v aplikaci ASP.NET MVC. Pokud se chcete dozvědět o EF Database First, podívejte se na sérii kurzů DB First.