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:
Pokud chcete použít dotaz bez sledování, přidáte na stránku Pro úpravy oddělení novou logiku ověření:
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éhoDbSet
objektem a jsou automaticky sledovány kontextem databáze, pokud sledování nevypnete. (Viz následující část oAsNoTracking
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).
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.
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:
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:
Vytvořte zobrazení ve složce Views\Course pro stránku Aktualizovat kredity kurzu:
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:
Klikněte na tlačítko Aktualizovat. Zobrazí se počet ovlivněných řádků:
Kliknutím na Zpět na seznam zobrazíte seznam kurzů s upravený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:
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:
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á metoduValidateOneAdministratorAssignmentPerInstructor
, 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í nastavitModified
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]}
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:
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:
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 jakoAdded
. 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
metodyDbSet
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.