Samouczek: informacje na temat zaawansowanych scenariuszy EF dla aplikacji internetowej MVC 5

W poprzednim samouczku zaimplementowano dziedziczenie tabeli na hierarchię. Ten samouczek zawiera wprowadzenie do kilku tematów, o których warto wiedzieć, gdy wykracza poza podstawy tworzenia ASP.NET aplikacji internetowych korzystających z programu Entity Framework Code First. W pierwszych kilku sekcjach znajdują się instrukcje krok po kroku, które przeprowadzą Cię przez kod i używają programu Visual Studio do wykonywania zadań Sekcje z wprowadzeniem kilku tematów z krótkimi wprowadzeniemi, a następnie linki do zasobów, aby uzyskać więcej informacji.

W przypadku większości tych tematów będziesz pracować z już utworzonymi stronami. Aby użyć pierwotnego kodu SQL do zbiorczych aktualizacji, utworzysz nową stronę, która aktualizuje liczbę środków na wszystkie kursy w bazie danych:

Update_Course_Credits_initial_page

W tym samouczku zostały wykonane następujące czynności:

  • Wykonywanie pierwotnych zapytań SQL
  • Wykonywanie zapytań bez śledzenia
  • Badanie zapytań SQL wysyłanych do bazy danych

Poznasz również następujące informacje:

  • Tworzenie warstwy abstrakcji
  • Klasy serwera proxy
  • Automatyczne wykrywanie zmian
  • Automatyczna walidacja
  • Entity Framework Power Tools
  • Kod źródłowy programu Entity Framework

Wymaganie wstępne

Wykonywanie pierwotnych zapytań SQL

Interfejs API Code First platformy Entity Framework zawiera metody, które umożliwiają przekazywanie poleceń SQL bezpośrednio do bazy danych. Do wyboru są następujące opcje:

  • Użyj metody DbSet.SqlQuery dla zapytań, które zwracają typy jednostek. Zwrócone obiekty muszą być typu oczekiwanego przez DbSet obiekt i są one automatycznie śledzone przez kontekst bazy danych, chyba że wyłączysz śledzenie. (Zobacz następującą sekcję dotyczącą metody AsNoTracking ).
  • Użyj metody Database.SqlQuery dla zapytań, które zwracają typy, które nie są jednostkami. Zwrócone dane nie są śledzone przez kontekst bazy danych, nawet jeśli używasz tej metody do pobierania typów jednostek.
  • Użyj polecenia Database.ExecuteSqlCommand dla poleceń innych niż zapytania.

Jedną z zalet korzystania z programu Entity Framework jest to, że pozwala uniknąć zbyt ścisłego wiązania kodu z określoną metodą przechowywania danych. Robi to przez wygenerowanie zapytań SQL i poleceń dla Ciebie, co również zwalnia cię od konieczności samodzielnego pisania ich. Istnieją jednak wyjątkowe scenariusze, w których trzeba uruchamiać określone zapytania SQL utworzone ręcznie, a te metody umożliwiają obsługę takich wyjątków.

Tak jak zawsze w przypadku wykonywania poleceń SQL w aplikacji internetowej, należy podjąć środki ostrożności, aby chronić witrynę przed atakami polegającymi na wstrzyknięciu kodu SQL. Jednym ze sposobów na to jest użycie sparametryzowanych zapytań w celu upewnienia się, że ciągi przesyłane przez stronę internetową nie mogą być interpretowane jako polecenia SQL. W tym samouczku użyjesz sparametryzowanych zapytań podczas integrowania danych wejściowych użytkownika z zapytaniem.

Wywoływanie zapytania zwracającego jednostki

Klasa DbSet<TEntity> udostępnia metodę, której można użyć do wykonania zapytania zwracającego jednostkę typu TEntity. Aby zobaczyć, jak to działa, zmienisz kod w Details metodzie Department kontrolera.

W pliku DepartmentController.cs w metodzie Details zastąp db.Departments.FindAsync wywołanie metody wywołaniem db.Departments.SqlQuery metody, jak pokazano w poniższym wyróżnionym kodzie:

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);
}

Aby sprawdzić, czy nowy kod działa poprawnie, wybierz kartę Działy , a następnie pozycję Szczegóły dla jednego z działów. Upewnij się, że wszystkie dane są wyświetlane zgodnie z oczekiwaniami.

Wywoływanie zapytania zwracającego inne typy obiektów

Wcześniej utworzono siatkę statystyk uczniów dla strony Informacje, która pokazywała liczbę uczniów dla każdej daty rejestracji. Kod, który wykonuje to w pliku HomeController.cs , używa LINQ:

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

Załóżmy, że chcesz napisać kod, który pobiera te dane bezpośrednio w języku SQL, zamiast używać linQ. Aby to zrobić, należy uruchomić zapytanie zwracające coś innego niż obiekty jednostki, co oznacza, że należy użyć metody Database.SqlQuery .

W pliku HomeController.cs zastąp instrukcję LINQ w metodzie About instrukcją SQL, jak pokazano w poniższym wyróżnionym kodzie:

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());
}

Uruchom stronę Informacje. Sprawdź, czy wyświetla te same dane, które zostały wcześniej.

Wywoływanie zapytania aktualizacji

Załóżmy, że administratorzy platformy Contoso University chcą mieć możliwość przeprowadzania zbiorczych zmian w bazie danych, takich jak zmiana liczby środków na każdy kurs. Jeśli uniwersytet ma dużą liczbę kursów, niewydajne byłoby pobranie ich wszystkich jako jednostek i zmiana ich indywidualnie. W tej sekcji zaimplementujesz stronę internetową, która umożliwia użytkownikowi określenie współczynnika, przez który należy zmienić liczbę środków na wszystkie kursy, a następnie wprowadzisz zmianę, wykonując instrukcję SQL UPDATE .

W pliku CourseController.cs dodaj UpdateCourseCredits metody dla HttpGet i 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();
}

Gdy kontroler przetwarza HttpGet żądanie, nic nie jest zwracane w zmiennej ViewBag.RowsAffected , a widok wyświetla puste pole tekstowe i przycisk przesyłania.

Po kliknięciu przycisku Aktualizuj wywoływana HttpPost jest metoda i multiplier ma wartość wprowadzoną w polu tekstowym. Następnie kod wykonuje kod SQL, który aktualizuje kursy i zwraca liczbę wierszy, których dotyczy problem, do widoku w zmiennej ViewBag.RowsAffected . Gdy widok pobiera wartość w tej zmiennej, wyświetla liczbę wierszy zaktualizowanych zamiast pola tekstowego i przycisk przesyłania.

W pliku CourseController.cs kliknij prawym przyciskiem myszy jedną z UpdateCourseCredits metod, a następnie kliknij polecenie Dodaj widok. Zostanie wyświetlone okno dialogowe Dodawanie widoku . Pozostaw wartości domyślne i wybierz pozycję Dodaj.

W pliku Views\Course\UpdateCourseCredits.cshtml zastąp kod szablonu następującym kodem:

@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>

Uruchom metodę UpdateCourseCredits , wybierając kartę Kursy , a następnie dodając ciąg "/UpdateCourseCredits" na końcu adresu URL na pasku adresu przeglądarki (na przykład: http://localhost:50205/Course/UpdateCourseCredits). Wprowadź liczbę w polu tekstowym:

Update_Course_Credits_initial_page_with_2_entered

Kliknij przycisk Update (Aktualizuj). Zostanie wyświetlona liczba wierszy, których dotyczy problem.

Kliknij przycisk Wstecz do listy , aby wyświetlić listę kursów z poprawioną liczbą kredytów.

Aby uzyskać więcej informacji na temat nieprzetworzonych zapytań SQL, zobacz Nieprzetworzone zapytania SQL w witrynie MSDN.

Zapytania bez śledzenia

Gdy kontekst bazy danych pobiera wiersze tabeli i tworzy obiekty jednostki, które je reprezentują, domyślnie śledzi, czy jednostki w pamięci są zsynchronizowane z elementami w bazie danych. Dane w pamięci działają jako pamięć podręczna i są używane podczas aktualizowania jednostki. Buforowanie jest często niepotrzebne w aplikacji internetowej, ponieważ wystąpienia kontekstowe są zwykle krótkotrwałe (nowy jest tworzony i usuwany dla każdego żądania), a kontekst odczytujący jednostkę jest zwykle usuwany przed ponownym użyciem tej jednostki.

Śledzenie obiektów jednostki w pamięci można wyłączyć przy użyciu metody AsNoTracking . Typowe scenariusze, w których warto to zrobić, obejmują następujące elementy:

  • Zapytanie pobiera tak dużą ilość danych, że wyłączenie śledzenia może znacznie zwiększyć wydajność.
  • Chcesz dołączyć jednostkę, aby ją zaktualizować, ale wcześniej pobrano tę samą jednostkę do innego celu. Ponieważ jednostka jest już śledzona przez kontekst bazy danych, nie można dołączyć jednostki, którą chcesz zmienić. Jednym ze sposobów obsługi tej sytuacji jest użycie AsNoTracking opcji z wcześniejszym zapytaniem.

Aby zapoznać się z przykładem użycia metody AsNoTracking , zobacz wcześniejszą wersję tego samouczka. Ta wersja samouczka nie ustawia flagi Zmodyfikowane w jednostce utworzonej przez powiązanie modelu w metodzie Edit, więc nie jest potrzebna AsNoTracking.

Sprawdzanie bazy danych wysłanej do bazy danych sql

Czasami warto zobaczyć rzeczywiste zapytania SQL wysyłane do bazy danych. W poprzednim samouczku pokazano, jak to zrobić w kodzie przechwytywania; Teraz zobaczysz kilka sposobów, aby to zrobić bez pisania kodu przechwytywania. Aby to wypróbować, przyjrzyjmy się prostemu zapytaniu, a następnie przyjrzymy się temu, co się stanie z nim podczas dodawania opcji, takich jak ładowanie, filtrowanie i sortowanie.

W obszarze Controllers/CourseController zastąp metodę Index następującym kodem, aby tymczasowo zatrzymać ładowanie chętne:

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

Teraz ustaw punkt przerwania w instrukcji return (F9 z kursorem w tym wierszu). Naciśnij klawisz F5 , aby uruchomić projekt w trybie debugowania, a następnie wybierz stronę Indeks kursu. Gdy kod osiągnie punkt przerwania, sprawdź zmienną sql . Zostanie wyświetlone zapytanie wysyłane do SQL Server. Jest to prosta Select instrukcja.

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

Kliknij lupę, aby wyświetlić zapytanie w wizualizatorze tekstu.

Jeden zrzut ekranu przedstawiający kontroler kursu z wyróżnionym wierszem kodu. Inny zrzut ekranu przedstawiający otwarty wizualizator tekstu, a lupa jest zakreślona na czerwono w polu Wartość.

Teraz dodasz listę rozwijaną do strony Indeks kursów, aby użytkownicy mogli filtrować dla określonego działu. Posortujesz kursy według tytułu i określisz chętne ładowanie właściwości Department nawigacji.

W pliku CourseController.cs zastąp metodę Index następującym kodem:

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());
}

Przywróć punkt przerwania w instrukcji return .

Metoda odbiera wybraną wartość listy rozwijanej w parametrze SelectedDepartment . Jeśli nic nie zostanie wybrane, ten parametr będzie mieć wartość null.

SelectList Kolekcja zawierająca wszystkie działy jest przekazywana do widoku listy rozwijanej. Parametry przekazane do konstruktora SelectList określają nazwę pola wartości, nazwę pola tekstowego i wybrany element.

Get W przypadku metody Course repozytorium kod określa wyrażenie filtru, kolejność sortowania i chętne ładowanie dla Department właściwości nawigacji. Wyrażenie filtru zawsze zwraca wartość true , jeśli nic nie jest zaznaczone na liście rozwijanej (czyli SelectedDepartment ma wartość null).

W pliku Views\Course\Index.cshtml bezpośrednio przed tagiem otwierania table dodaj następujący kod, aby utworzyć listę rozwijaną i przycisk przesyłania:

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

Po ustawieniu punktu przerwania uruchom stronę Indeks kursu. Przejdź przez pierwszy raz, gdy kod osiągnie punkt przerwania, aby strona jest wyświetlana w przeglądarce. Wybierz dział z listy rozwijanej i kliknij pozycję Filtr.

Tym razem pierwszym punktem przerwania będzie zapytanie dla działów dla listy rozwijanej. Pomiń tę i wyświetl zmienną query przy następnym dotarciu kodu do punktu przerwania, aby zobaczyć, jak Course wygląda teraz zapytanie. Zobaczysz coś podobnego do następującego:

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

Widać, że zapytanie jest teraz zapytaniem JOIN , które ładuje Department dane wraz z Course danymi, i że zawiera klauzulę WHERE .

var sql = courses.ToString() Usuń wiersz.

Tworzenie warstwy abstrakcji

Wielu deweloperów pisze kod w celu zaimplementowania repozytorium i jednostki wzorców pracy jako otoki kodu, który współpracuje z programem Entity Framework. Te wzorce mają na celu utworzenie warstwy abstrakcji między warstwą dostępu do danych a warstwą logiki biznesowej aplikacji. Zaimplementowanie tych wzorców może pomóc odizolować aplikację od zmian w magazynie danych i ułatwić zautomatyzowane testowanie jednostkowe lub programowanie oparte na testach (TDD). Jednak pisanie dodatkowego kodu w celu zaimplementowania tych wzorców nie zawsze jest najlepszym wyborem dla aplikacji korzystających z platformy EF, z kilku powodów:

  • Sama klasa kontekstu EF izoluje kod z kodu specyficznego dla magazynu danych.
  • Klasa kontekstowa EF może pełnić rolę jednostki roboczej dla aktualizacji bazy danych, które są wykonywane przy użyciu platformy EF.
  • Funkcje wprowadzone w programie Entity Framework 6 ułatwiają implementowanie TDD bez konieczności pisania kodu repozytorium.

Aby uzyskać więcej informacji na temat implementowania repozytorium i jednostki wzorców pracy, zobacz program Entity Framework 5 w tej serii samouczków. Aby uzyskać informacje o sposobach implementacji TDD w programie Entity Framework 6, zobacz następujące zasoby:

Klasy serwera proxy

Gdy platforma Entity Framework tworzy wystąpienia jednostek (na przykład podczas wykonywania zapytania), często tworzy je jako wystąpienia dynamicznie generowanego typu pochodnego, który działa jako serwer proxy dla jednostki. Zobacz na przykład dwa poniższe obrazy debugera. Na pierwszym obrazie widać, że zmienna student jest oczekiwanym Student typem natychmiast po utworzeniu wystąpienia jednostki. Na drugim obrazie po użyciu programu EF do odczytu jednostki ucznia z bazy danych zostanie wyświetlona klasa serwera proxy.

Przed klasą serwera proxy

Po klasie serwera proxy

Ta klasa serwera proxy zastępuje niektóre właściwości wirtualne jednostki w celu wstawiania punktów zaczepienia do wykonywania akcji automatycznie po korzystaniu z właściwości. Jedną z funkcji, do których służy ten mechanizm, jest ładowanie z opóźnieniem.

W większości przypadków nie trzeba pamiętać o użyciu serwerów proxy, ale istnieją wyjątki:

  • W niektórych scenariuszach możesz uniemożliwić programowi Entity Framework tworzenie wystąpień serwera proxy. Na przykład w przypadku serializacji jednostek zwykle potrzebujesz klas POCO, a nie klas proxy. Jednym ze sposobów uniknięcia problemów z serializacji jest serializowanie obiektów transferu danych (DTO) zamiast obiektów jednostek, jak pokazano w samouczku Korzystanie z internetowego interfejsu API z programem Entity Framework . Innym sposobem jest wyłączenie tworzenia serwera proxy.
  • Podczas tworzenia wystąpienia klasy jednostki przy użyciu new operatora nie uzyskujesz wystąpienia serwera proxy. Oznacza to, że nie uzyskujesz funkcji, takich jak ładowanie leniwe i automatyczne śledzenie zmian. Zwykle jest to w porządku; Zwykle nie trzeba ładować z opóźnieniem, ponieważ tworzysz nową jednostkę, która nie znajduje się w bazie danych, i zwykle nie potrzebujesz śledzenia zmian, jeśli jawnie oznaczasz jednostkę jako Added. Jeśli jednak potrzebujesz ładowania z opóźnieniem i potrzebujesz śledzenia zmian, możesz utworzyć nowe wystąpienia jednostek z serwerami proxy przy użyciu metody DbSetCreate klasy.
  • Możesz chcieć uzyskać rzeczywisty typ jednostki z typu serwera proxy. Możesz użyć metody ObjectContextGetObjectType klasy, aby uzyskać rzeczywisty typ jednostki wystąpienia typu serwera proxy.

Aby uzyskać więcej informacji, zobacz Praca z serwerami proxy w witrynie MSDN.

Automatyczne wykrywanie zmian

Program Entity Framework określa, jak zmieniła się jednostka (i w związku z tym które aktualizacje muszą być wysyłane do bazy danych), porównując bieżące wartości jednostki z oryginalnymi wartościami. Oryginalne wartości są przechowywane, gdy jednostka jest odpytywane lub dołączane. Niektóre metody, które powodują automatyczne wykrywanie zmian, są następujące:

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

Jeśli śledzisz dużą liczbę jednostek i wielokrotnie wywołujesz jedną z tych metod w pętli, możesz uzyskać znaczne ulepszenia wydajności, tymczasowo wyłączając automatyczne wykrywanie zmian przy użyciu właściwości AutoDetectChangesEnabled . Aby uzyskać więcej informacji, zobacz Automatyczne wykrywanie zmian w witrynie MSDN.

Automatyczna walidacja

Podczas wywoływania SaveChanges metody program Entity Framework domyślnie weryfikuje dane we wszystkich właściwościach wszystkich zmienionych jednostek przed zaktualizowaniem bazy danych. Jeśli zaktualizowano dużą liczbę jednostek i dane zostały już zweryfikowane, ta praca jest niepotrzebna. Proces zapisywania zmian może zająć mniej czasu, tymczasowo wyłączając walidację. Można to zrobić przy użyciu właściwości ValidateOnSaveEnabled . Aby uzyskać więcej informacji, zobacz Walidacja w witrynie MSDN.

Entity Framework Power Tools

Entity Framework Power Tools to dodatek programu Visual Studio, który został użyty do tworzenia diagramów modelu danych przedstawionych w tych samouczkach. Narzędzia mogą również wykonywać inne funkcje, takie jak generowanie klas jednostek na podstawie tabel w istniejącej bazie danych, dzięki czemu można używać bazy danych z kodem First. Po zainstalowaniu narzędzi niektóre dodatkowe opcje są wyświetlane w menu kontekstowym. Na przykład po kliknięciu prawym przyciskiem myszy klasy kontekstu w Eksplorator rozwiązań zobaczysz opcję Entity Framework i Entity Framework. Dzięki temu można wygenerować diagram. W przypadku korzystania z aplikacji Code First nie można zmienić modelu danych na diagramie, ale możesz przenieść elementy, aby ułatwić ich zrozumienie.

Diagram EF

Kod źródłowy programu Entity Framework

Kod źródłowy dla programu Entity Framework 6 jest dostępny w witrynie GitHub. Możesz zgłosić usterki i współtworzyć własne ulepszenia kodu źródłowego ef.

Mimo że kod źródłowy jest otwarty, program Entity Framework jest w pełni obsługiwany jako produkt firmy Microsoft. Zespół microsoft Entity Framework ma kontrolę nad tym, które współtworzenia są akceptowane, i testuje wszystkie zmiany kodu, aby zapewnić jakość każdej wersji.

Podziękowania

  • Tom Dykstra napisał oryginalną wersję tego samouczka, współautor aktualizacji EF 5 i napisał aktualizację EF 6. Tom jest starszym pisarzem programistycznym w zespole ds. platformy i narzędzi firmy Microsoft.
  • Rick Anderson ( twitter @RickAndMSFT) wykonał większość prac nad aktualizacją samouczka dla platform EF 5 i MVC 4 oraz współautorem aktualizacji EF 6. Rick jest starszym pisarzem programistycznym dla firmy Microsoft koncentrującym się na platformie Azure i MVC.
  • Rowan Miller i inni członkowie zespołu Platformy Entity Framework pomogli w przeglądach kodu i pomogli debugować wiele problemów z migracjami, które powstały podczas aktualizowania samouczka dla platform EF 5 i EF 6.

Rozwiązywanie typowych problemów

Nie można utworzyć/skopiować w tle

Komunikat o błędzie:

Nie można utworzyć/kopii w tle "<nazwa pliku>", jeśli ten plik już istnieje.

Rozwiązanie

Poczekaj kilka sekund i odśwież stronę.

nie rozpoznano Update-Database

Komunikat o błędzie (z Update-Database polecenia w PMC):

Termin "Update-Database" nie jest rozpoznawany jako nazwa polecenia cmdlet, funkcji, pliku skryptu lub programu możliwego do działania. Sprawdź pisownię nazwy lub jeśli ścieżka została dołączona, sprawdź, czy ścieżka jest poprawna i spróbuj ponownie.

Rozwiązanie

Zamknij program Visual Studio. Otwórz ponownie projekt i spróbuj ponownie.

Walidacja nie powiodła się

Komunikat o błędzie (z Update-Database polecenia w PMC):

Walidacja nie powiodła się dla co najmniej jednej jednostki. Aby uzyskać więcej informacji, zobacz właściwość "EntityValidationErrors".

Rozwiązanie

Jedną z przyczyn tego problemu są błędy walidacji po uruchomieniu Seed metody. Aby uzyskać porady dotyczące debugowania metody, zobacz Seeding and Debugging Entity Framework (EF) DBs (Wypełnianie i debugowanie baz danych platformy Entity Framework (EF).Seed

Błąd HTTP 500.19

Komunikat o błędzie:

Błąd HTTP 500.19 — wewnętrzny błąd serwera Nie można uzyskać dostępu do żądanej strony, ponieważ powiązane dane konfiguracji strony są nieprawidłowe.

Rozwiązanie

Jednym ze sposobów uzyskania tego błędu jest posiadanie wielu kopii rozwiązania, z których każdy korzysta z tego samego numeru portu. Zazwyczaj można rozwiązać ten problem, zamykając wszystkie wystąpienia programu Visual Studio, a następnie uruchamiając ponownie projekt, nad którym pracujesz. Jeśli to nie zadziała, spróbuj zmienić numer portu. Kliknij prawym przyciskiem myszy plik projektu, a następnie kliknij polecenie właściwości. Wybierz kartę Sieć Web , a następnie zmień numer portu w polu tekstowym Adres URL projektu .

Błąd podczas lokalizowania wystąpienia SQL Server

Komunikat o błędzie:

Podczas nawiązywania połączenia z serwerem SQL wystąpił błąd dotyczący sieci lub wystąpienia. Serwer nie został znaleziony lub był niedostępny. Sprawdź, czy nazwa wystąpienia jest prawidłowa oraz czy program SQL Server skonfigurowano tak, aby zezwalał na połączenia zdalne. (dostawca: interfejsy sieciowe SQL, błąd: 26 — Błąd podczas lokalizowania określonego serwera/wystąpienia)

Rozwiązanie

Sprawdź parametry połączenia. Jeśli baza danych została ręcznie usunięta, zmień nazwę bazy danych w ciągu konstrukcyjnym.

Uzyskiwanie kodu

Pobieranie ukończonego projektu

Dodatkowe zasoby

Aby uzyskać więcej informacji na temat pracy z danymi przy użyciu programu Entity Framework, zobacz stronę dokumentacji ef w witrynie MSDN i ASP.NET dostęp do danych — zalecane zasoby.

Aby uzyskać więcej informacji na temat wdrażania aplikacji internetowej po jej skompilowaniu, zobacz ASP.NET Web Deployment — zalecane zasoby w bibliotece MSDN.

Aby uzyskać informacje o innych tematach związanych z usługą MVC, takich jak uwierzytelnianie i autoryzacja, zobacz ASP.NET MVC — zalecane zasoby.

Następne kroki

W tym samouczku zostały wykonane następujące czynności:

  • Wykonywanie nieprzetworzonych zapytań SQL
  • Wykonywanie zapytań bez śledzenia
  • Zbadane zapytania SQL wysyłane do bazy danych

Przedstawiono również następujące informacje:

  • Tworzenie warstwy abstrakcji
  • Klasy serwera proxy
  • Automatyczne wykrywanie zmian
  • Automatyczna walidacja
  • Entity Framework Power Tools
  • Kod źródłowy programu Entity Framework

Spowoduje to ukończenie tej serii samouczków dotyczących korzystania z platformy Entity Framework w aplikacji ASP.NET MVC. Jeśli chcesz dowiedzieć się więcej o usłudze EF Database First, zobacz serię samouczków DB First.