Megosztás a következőn keresztül:


4. rész, modell hozzáadása egy ASP.NET Core MVC-alkalmazáshoz

Note

Ez nem a cikk legújabb verziója. Az aktuális kiadásról a cikk .NET 10-es verziójában olvashat.

Warning

A ASP.NET Core ezen verziója már nem támogatott. További információ: .NET és .NET Core támogatási szabályzat. A jelen cikk .NET 9-es verzióját lásd az aktuális kiadásért .

Által Rick Anderson és Jon P Smith.

Ebben az oktatóanyagban osztályokat adunk hozzá az adatbázisokban lévő filmek kezeléséhez. Ezek az osztályok az MVC alkalmazás "Model" része.

Ezek a modellosztályok az Entity Framework Core (EF Core) használatával működnek együtt egy adatbázissal. EF Core Egy objektum-relációs leképezési (ORM) keretrendszer, amely leegyszerűsíti az írandó adatelérési kódot.

A létrehozott modellosztályokat POCO-osztályoknak nevezzük a Plain Old CLR Objectsből. A POCO-osztályok nem függenek a EF Core. Csak az adatbázisban tárolandó adatok tulajdonságait határozzák meg.

Ebben az oktatóanyagban a modellosztályok jönnek létre először, és EF Core létrehozza az adatbázist.

Adatmodell-osztály hozzáadása

Kattintson a jobb gombbal a Models mappára >Hozzáadás>Osztály. A fájl neve legyen Movie.cs.

Frissítse a Models/Movie.cs fájlt a következő kóddal:

using System.ComponentModel.DataAnnotations;

namespace MvcMovie.Models;

public class Movie
{
    public int Id { get; set; }
    public string? Title { get; set; }
    [DataType(DataType.Date)]
    public DateTime ReleaseDate { get; set; }
    public string? Genre { get; set; }
    public decimal Price { get; set; }
}

Az Movie osztály tartalmaz egy Id mezőt, amelyet az adatbázis az elsődleges kulcshoz szükséges.

A DataType rajta lévő ReleaseDate attribútum megadja az adatok típusát (Date). Ezzel az attribútummal:

  • A felhasználónak nem kell időadatokat megadnia a dátum mezőben.
  • Csak a dátum jelenik meg, az időadatok nem.

A DataAnnotations egy későbbi oktatóanyagban kerülnek tárgyalásra.

Az string utáni kérdőjel azt jelzi, hogy a tulajdonság null értékű. További információért tekintse meg: Null értékű hivatkozástípusok.

NuGet-csomagok hozzáadása

A Visual Studio automatikusan telepíti a szükséges csomagokat.

Állítsa össze a projektet fordítóhibák ellenőrzéseként.

Filmoldalak előkészítése

Használja a keretrendszer eszközt a Create, Read, Update, és Delete (CRUD) oldalak készítéséhez a film modell számára.

A Megoldáskezelőben kattintson a jobb gombbal a Vezérlők mappára, és válassza az Új állványozott elem hozzáadása >lehetőséget.

a fenti lépés nézete

Az Új vázolt elem hozzáadása párbeszédpanelen:

  • A bal oldali panelen válassza a Telepített>közös>MVC lehetőséget.
  • Válassza ki a nézetekkel rendelkező MVC-vezérlőt az Entity Framework használatával.
  • Válassza a Hozzáadás lehetőséget.

Állványzat hozzáadása párbeszédpanel

Töltse ki az Entity Frameworköt használó nézetekkel rendelkező MVC-vezérlő hozzáadása párbeszédpanelt:

  • A Modell osztály legördülő menüjében válassza a Mozgókép (MvcMovie.Models) lehetőséget.
  • Az Data context class sorban válassza ki a + (plusz) jelet.
    • Az Adatkörnyezet hozzáadása párbeszédpanelen létre jön az MvcMovie.Data.MvcMovieContext osztálynév.
    • Válassza a Hozzáadás lehetőséget.
  • Az Adatbázis-szolgáltató legördülő listában válassza SQL Serverlehetőséget.
  • Nézetek és vezérlő neve: Tartsa meg az alapértelmezett értéket.
  • Válassza a Hozzáadás lehetőséget.

Adatkörnyezet hozzáadása – alapértelmezett értékek megtartása

Ha hibaüzenet jelenik meg, válassza az Add a second time to try it again (Második próbálkozás hozzáadása) lehetőséget.

Az állványzat a következő csomagokat adja hozzá:

  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.Tools
  • Microsoft.VisualStudio.Web.CodeGeneration.Design

Az állványzat a következőket hozza létre:

  • Filmvezérlő: Controllers/MoviesController.cs
  • Razor fájlok megtekintése létrehozási, törlési, részleteki, szerkesztési és indexelési lapokhoz: Views/Movies/*.cshtml
  • Adatbázis környezeti osztálya: Data/MvcMovieContext.cs

Az állványzat a következőket frissíti:

  • Beszúrja a szükséges csomaghivatkozásokat a MvcMovie.csproj projektfájlba.
  • Regisztrálja az adatbázis-környezetet a Program.cs fájlban.
  • Hozzáad egy adatbázis-kapcsolati sztringet a appsettings.json fájlhoz.

Ezeknek a fájloknak és fájlfrissítéseknek az automatikus létrehozását állványzatnak nevezzük.

Az állványozott lapok még nem használhatók, mert az adatbázis nem létezik. Az alkalmazás futtatása és a Filmalkalmazás hivatkozásra történő kattintás az adatbázis nem nyitható meg vagy nincs ilyen tábla: Movie hibaüzenetet eredményez.

Hozza létre az alkalmazást annak ellenőrzéséhez, hogy nincsenek-e hibák.

Kezdeti migrálás

Az adatbázis létrehozásához használja a EF CoreMigrálás funkciót . A migráció egy olyan eszközkészlet, amely létrehoz és frissít egy adatbázist az adatmodellel összhangban.

Az Eszközök menüben válassza a NuGet Package Manager Csomagkezelő>konzolt .

A Package Manager-konzolon (PMC) adja meg a következő parancsot:

Add-Migration InitialCreate

  • Add-Migration InitialCreate: Migrálási Migrations/{timestamp}_InitialCreate.cs fájlt hoz létre. A InitialCreate argumentum a migráció neve. Bármilyen név használható, de konvenció szerint az áttelepítést leíró név van kiválasztva. Mivel ez az első migrálás, a létrehozott osztály az adatbázisséma létrehozásához szükséges kódot tartalmazza. Az adatbázisséma az osztályban MvcMovieContext megadott modellen alapul.

A következő figyelmeztetés jelenik meg, amely egy későbbi lépésben lesz kezelve:

Az 'Movie' entitástípus 'Price' nevű tizedes tulajdonságához nincs megadva tárolótípus. Ez az értékek csonkolásához vezet, ha nem illeszkednek az alapértelmezett pontossághoz és mértékhez. Explicit módon adja meg azt az SQL Server-oszloptípust, amely képes az "OnModelCreating" összes értékének elhelyezésére a HasColumnType használatával, adja meg a pontosságot és a skálázást a HasPrecision használatával, vagy konfiguráljon egy értékkonvertert a "HasConversion" használatával.

A PMC-ben adja meg a következő parancsot:

Update-Database

  • Update-Database: Frissíti az adatbázist a legújabb migrálásra, amelyet az előző parancs hozott létre. Ez a parancs futtatja a metódust Up a Migrations/{time-stamp}_InitialCreate.cs fájlban, amely létrehozza az adatbázist.

A PMC-eszközökkel kapcsolatos további információkért EF Corelásd EF Core az eszközökre vonatkozó referencia - PMC-t a Visual Studióban.

Az alkalmazás tesztelése

Futtassa az alkalmazást, és válassza a Filmalkalmazás hivatkozást.

Ha a következőhöz hasonló kivételt kap, előfordulhat, hogy a Update-Database kihagyta a parancsot:

SqlException: Cannot open database "MvcMovieContext-1" requested by the login. The login failed.

Note

Előfordulhat, hogy nem tud tizedesvesszőt beírni a Price mezőbe. Az olyan nem angol nyelvű területi beállítások jQuery-érvényesítésének támogatásához, amelyek vesszőt (",") használnak tizedesvesszőhöz és nem US-English dátumformátumokhoz, az alkalmazást globalizálni kell. A globalizációval kapcsolatos utasításokért tekintse meg a ésGitHub-problémát.

A létrehozott adatbázis környezeti osztályának és regisztrációjának vizsgálata

Ezzel EF Coreaz adathozzáférést egy modell használatával hajtja végre. A modell entitásosztályokból és környezeti objektumból áll, amelyek az adatbázissal való munkamenetet jelölik. A környezeti objektum lehetővé teszi az adatok lekérdezését és mentését. Az adatbázis-környezet a Microsoft.EntityFrameworkCore.DbContext fájlból származik, és megadja az adatmodellbe felvenni kívánt entitásokat.

Az állványzat létrehozza az Data/MvcMovieContext.cs adatbázis környezeti osztályát:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using MvcMovie.Models;

namespace MvcMovie.Data
{
    public class MvcMovieContext : DbContext
    {
        public MvcMovieContext (DbContextOptions<MvcMovieContext> options)
            : base(options)
        {
        }

        public DbSet<MvcMovie.Models.Movie> Movie { get; set; } = default!;
    }
}

Az előző kód létrehoz egy DbSet Movie< tulajdonságot>, amely az adatbázisban lévő filmeket jelöli.

Függőséginjektálás

ASP.NET Core függőséginjektálással (DI) épül fel. Az olyan szolgáltatások, mint az adatbázis-környezet, a DI-ben vannak regisztrálva.Program.cs Ezeket a szolgáltatásokat konstruktorparamétereken keresztül biztosítjuk azoknak az összetevőknek, amelyek megkövetelik őket.

A fájlban a Controllers/MoviesController.cs konstruktor függőséginjektálással injektálja az MvcMovieContext adatbázis-környezetet a vezérlőbe. Az adatbázis-környezet a vezérlőben található CRUD-metódusok mindegyikében használatos.

Az előzetes kódgenerálás a következő kiemelt kódot generálta a(z) Program.cs alatt.

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext") ?? throw new InvalidOperationException("Connection string 'MvcMovieContext' not found.")));

A ASP.NET Core konfigurációs rendszer beolvassa az "MvcMovieContext" adatbázis kapcsolati sztringet.

A létrehozott adatbázis kapcsolati sztringjének vizsgálata

Az állványzat hozzáadott egy kapcsolati karakterláncot a appsettings.json fájlhoz.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-4ebefa10-de29-4dea-b2ad-8a8dc6bcf374;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

A helyi fejlesztéshez a ASP.NET Core konfigurációs rendszer beolvassa a ConnectionString kulcsot a appsettings.json fájlból.

Az InitialCreate osztály

Vizsgálja meg a migrálási Migrations/{timestamp}_InitialCreate.cs fájlt:

using System;
using Microsoft.EntityFrameworkCore.Migrations;

#nullable disable

namespace MvcMovie.Migrations
{
    /// <inheritdoc />
    public partial class InitialCreate : Migration
    {
        /// <inheritdoc />
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "Movie",
                columns: table => new
                {
                    Id = table.Column<int>(type: "int", nullable: false)
                        .Annotation("SqlServer:Identity", "1, 1"),
                    Title = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    ReleaseDate = table.Column<DateTime>(type: "datetime2", nullable: false),
                    Genre = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Movie", x => x.Id);
                });
        }

        /// <inheritdoc />
        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "Movie");
        }
    }
}

Az előző kódban:

  • InitialCreate.Up létrehozza a Movie táblát Id , és elsődleges kulcsként konfigurálja.
  • InitialCreate.Down Visszaállítja a migrálás által végrehajtott sémamódosításokat Up .

Függőséginjektálás a vezérlőben

Nyissa meg a Controllers/MoviesController.cs fájlt, és vizsgálja meg a konstruktort:

public class MoviesController : Controller
{
    private readonly MvcMovieContext _context;

    public MoviesController(MvcMovieContext context)
    {
        _context = context;
    }

A konstruktor függőséginjektálással injektálja az adatbázis-környezetet (MvcMovieContext) a vezérlőbe. Az adatbázis-környezet a vezérlőben található CRUD-metódusok mindegyikében használatos.

Tesztelje a Létrehozás lapot. Adja meg és küldje el az adatokat.

Tesztelje a Szerkesztés, a Részletek és a Törlés lapot.

Erősen típusozott modellek és az @model irányelv

Az oktatóanyag korábbi részében láthatta, hogyan adhat át egy vezérlő adatokat vagy objektumokat egy nézetnek a ViewData szótár használatával. A ViewData szótár egy dinamikus objektum, amely kényelmes, késői kötésű módot biztosít az információk nézetbe való továbbítására.

Az MVC lehetővé teszi, hogy szorosan típusos modell objektumokat adjon át egy nézetnek. Ez a szigorúan típusos megközelítés lehetővé teszi a fordítási időben történő kód ellenőrzést. Az sablon mechanizmus egy erősen típusos modellt továbbított a MoviesController osztályban és nézetekben.

Vizsgálja meg a fájlban létrehozott Details metódust Controllers/MoviesController.cs :

// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    var movie = await _context.Movie
        .FirstOrDefaultAsync(m => m.Id == id);
    if (movie == null)
    {
        return NotFound();
    }

    return View(movie);
}

A id paramétert általában útvonaladatokként adjuk át. Például https://localhost:{PORT}/movies/details/1 készletek:

  • A movies vezérlő első URL-szegmense a vezérlő számára.
  • A második URL-szegmensre irányuló detailsművelet.
  • A id 1-re van beállítva, az utolsó URL-szegmens.

A id lekérdezési sztringgel is átadható, ahogyan az alábbi példában is látható:

https://localhost:{PORT}/movies/details?id=1

A id paraméter null értékű típusként (int?) van definiálva abban az esetben, ha az id érték nincs megadva.

Egy lambda kifejezést adnak át a FirstOrDefaultAsync metódusnak, hogy kiválassza azokat a mozgókép-entitásokat, amelyek megfelelnek az útvonali adatoknak vagy a lekérdezési karakterlánc értéknek.

var movie = await _context.Movie
    .FirstOrDefaultAsync(m => m.Id == id);

Ha egy filmet találunk, a Movie modell egy példányát átadjuk a Details nézetnek.

return View(movie);

Vizsgálja meg a Views/Movies/Details.cshtml fájl tartalmát:

@model MvcMovie.Models.Movie

@{
    ViewData["Title"] = "Details";
}

<h1>Details</h1>

<div>
    <h4>Movie</h4>
    <hr />
    <dl class="row">
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.Title)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.Title)
        </dd>
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.ReleaseDate)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.ReleaseDate)
        </dd>
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.Genre)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.Genre)
        </dd>
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.Price)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.Price)
        </dd>
    </dl>
</div>
<div>
    <a asp-action="Edit" asp-route-id="@Model.Id">Edit</a> |
    <a asp-action="Index">Back to List</a>
</div>

A @model nézetfájl tetején található utasítás határozza meg a nézet által várt objektum típusát. A filmvezérlő létrehozásakor a következő @model utasítás lett belefoglalva:

@model MvcMovie.Models.Movie

Ez az @model irányelv hozzáférést biztosít ahhoz a filmhez, amelyet a vezérlő átadott a nézetnek. Az Model objektum erősen be van gépelve. Például a Details.cshtml nézetben a kód átadja az egyes film mezőket az DisplayNameFor és DisplayFor HTML Segítőknek az erősen típusos Model objektummal. A Create metódusok és Edit nézetek egy modellobjektumot Movie is átadnak.

Vizsgálja meg a Index.cshtml nézetet és a metódust Index a Filmek vezérlőben. Figyelje meg, hogy a kód hogyan hoz létre objektumot List , amikor meghívja a metódust View . A kód a műveletmetódusból a Movies nézetbe továbbítja a Index listát:

// GET: Movies
public async Task<IActionResult> Index()
{
    return View(await _context.Movie.ToListAsync());
}

A kód a probléma részleteit adja vissza, ha az Movie adatkörnyezet tulajdonsága null.

A filmek vezérlőjének létrehozásakor a sablon a következő @model utasítást tartalmazta a Index.cshtml fájl tetején:

@model IEnumerable<MvcMovie.Models.Movie>

Az @model irányelv lehetővé teszi a filmek listájához való hozzáférést, amelyet a vezérlő egy erősen típusos Model objektummal adott át a nézetnek. A nézetben például a Index.cshtml kód egy utasítással foreach végighalad a filmeken az erősen gépelt Model objektumon:

@model IEnumerable<MvcMovie.Models.Movie>

@{
    ViewData["Title"] = "Index";
}

<h1>Index</h1>

<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ReleaseDate)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Genre)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Price)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Title)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ReleaseDate)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Genre)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Price)
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
                <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
            </td>
        </tr>
}
    </tbody>
</table>

Mivel az Model objektum erősen típusos IEnumerable<Movie> objektumként van típusosítva, a ciklus minden eleme Movie típusú. A fordító többek között ellenőrzi a kódban használt típusokat.

További erőforrások

Ebben az oktatóanyagban osztályokat adunk hozzá az adatbázisokban lévő filmek kezeléséhez. Ezek az osztályok az MVC alkalmazás "Model" része.

Ezek a modellosztályok az Entity Framework Core (EF Core) használatával működnek együtt egy adatbázissal. EF Core Egy objektum-relációs leképezési (ORM) keretrendszer, amely leegyszerűsíti az írandó adatelérési kódot.

A létrehozott modellosztályokat POCO-osztályoknak nevezzük a Plain Old CLR Objectsből. A POCO-osztályok nem függenek a EF Core. Csak az adatbázisban tárolandó adatok tulajdonságait határozzák meg.

Ebben az oktatóanyagban a modellosztályok jönnek létre először, és EF Core létrehozza az adatbázist.

Adatmodell-osztály hozzáadása

Kattintson a jobb gombbal a Models mappára >Hozzáadás>Osztály. A fájl neve legyen Movie.cs.

Frissítse a Models/Movie.cs fájlt a következő kóddal:

using System.ComponentModel.DataAnnotations;

namespace MvcMovie.Models;

public class Movie
{
    public int Id { get; set; }
    public string? Title { get; set; }
    [DataType(DataType.Date)]
    public DateTime ReleaseDate { get; set; }
    public string? Genre { get; set; }
    public decimal Price { get; set; }
}

Az Movie osztály tartalmaz egy Id mezőt, amelyet az adatbázis az elsődleges kulcshoz szükséges.

A DataType rajta lévő ReleaseDate attribútum megadja az adatok típusát (Date). Ezzel az attribútummal:

  • A felhasználónak nem kell időadatokat megadnia a dátum mezőben.
  • Csak a dátum jelenik meg, az időadatok nem.

A DataAnnotations egy későbbi oktatóanyagban kerülnek tárgyalásra.

Az string utáni kérdőjel azt jelzi, hogy a tulajdonság null értékű. További információért tekintse meg: Null értékű hivatkozástípusok.

NuGet-csomagok hozzáadása

A Visual Studio automatikusan telepíti a szükséges csomagokat.

Állítsa össze a projektet fordítóhibák ellenőrzéseként.

Filmoldalak előkészítése

Használja a keretrendszer eszközt a Create, Read, Update, és Delete (CRUD) oldalak készítéséhez a film modell számára.

A Megoldáskezelőben kattintson a jobb gombbal a Vezérlők mappára, és válassza az Új állványozott elem hozzáadása >lehetőséget.

a fenti lépés nézete

Az Új vázolt elem hozzáadása párbeszédpanelen:

  • A bal oldali panelen válassza a Telepített>közös>MVC lehetőséget.
  • Válassza ki a nézetekkel rendelkező MVC-vezérlőt az Entity Framework használatával.
  • Válassza a Hozzáadás lehetőséget.

Állványzat hozzáadása párbeszédpanel

Töltse ki az Entity Frameworköt használó nézetekkel rendelkező MVC-vezérlő hozzáadása párbeszédpanelt:

  • A Modell osztály legördülő menüjében válassza a Mozgókép (MvcMovie.Models) lehetőséget.
  • Az Data context class sorban válassza ki a + (plusz) jelet.
    • Az Adatkörnyezet hozzáadása párbeszédpanelen létre jön az MvcMovie.Data.MvcMovieContext osztálynév.
    • Válassza a Hozzáadás lehetőséget.
  • Az Adatbázis-szolgáltató legördülő listában válassza SQL Serverlehetőséget.
  • Nézetek és vezérlő neve: Tartsa meg az alapértelmezett értéket.
  • Válassza a Hozzáadás lehetőséget.

Adatkörnyezet hozzáadása – alapértelmezett értékek megtartása

Ha hibaüzenet jelenik meg, válassza az Add a second time to try it again (Második próbálkozás hozzáadása) lehetőséget.

Az állványzat a következő csomagokat adja hozzá:

  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.Tools
  • Microsoft.VisualStudio.Web.CodeGeneration.Design

Az állványzat a következőket hozza létre:

  • Filmvezérlő: Controllers/MoviesController.cs
  • Razor fájlok megtekintése létrehozási, törlési, részleteki, szerkesztési és indexelési lapokhoz: Views/Movies/*.cshtml
  • Adatbázis környezeti osztálya: Data/MvcMovieContext.cs

Az állványzat a következőket frissíti:

  • Beszúrja a szükséges csomaghivatkozásokat a MvcMovie.csproj projektfájlba.
  • Regisztrálja az adatbázis-környezetet a Program.cs fájlban.
  • Hozzáad egy adatbázis-kapcsolati sztringet a appsettings.json fájlhoz.

Ezeknek a fájloknak és fájlfrissítéseknek az automatikus létrehozását állványzatnak nevezzük.

Az állványozott lapok még nem használhatók, mert az adatbázis nem létezik. Az alkalmazás futtatása és a Filmalkalmazás hivatkozásra történő kattintás az adatbázis nem nyitható meg vagy nincs ilyen tábla: Movie hibaüzenetet eredményez.

Hozza létre az alkalmazást annak ellenőrzéséhez, hogy nincsenek-e hibák.

Kezdeti migrálás

Az adatbázis létrehozásához használja a EF CoreMigrálás funkciót . A migráció egy olyan eszközkészlet, amely létrehoz és frissít egy adatbázist az adatmodellel összhangban.

Az Eszközök menüben válassza a NuGet Package Manager Csomagkezelő>konzolt .

A Package Manager-konzolon (PMC) adja meg a következő parancsokat:

Add-Migration InitialCreate
Update-Database

  • Add-Migration InitialCreate: Migrálási Migrations/{timestamp}_InitialCreate.cs fájlt hoz létre. A InitialCreate argumentum a migráció neve. Bármilyen név használható, de konvenció szerint az áttelepítést leíró név van kiválasztva. Mivel ez az első migrálás, a létrehozott osztály az adatbázisséma létrehozásához szükséges kódot tartalmazza. Az adatbázisséma az osztályban MvcMovieContext megadott modellen alapul.

  • Update-Database: Frissíti az adatbázist a legújabb migrálásra, amelyet az előző parancs hozott létre. Ez a parancs futtatja a metódust Up a Migrations/{time-stamp}_InitialCreate.cs fájlban, amely létrehozza az adatbázist.

A Update-Database parancs a következő figyelmeztetést hozza létre:

Az 'Movie' entitástípus 'Price' nevű tizedes tulajdonságához nincs megadva tárolótípus. Ez az értékek csonkolásához vezet, ha nem illeszkednek az alapértelmezett pontossághoz és mértékhez. Explicit módon adja meg azt az SQL Server-oszloptípust, amely képes az "OnModelCreating" összes értékének elhelyezésére a HasColumnType használatával, adja meg a pontosságot és a skálázást a HasPrecision használatával, vagy konfiguráljon egy értékkonvertert a "HasConversion" használatával.

Hagyja figyelmen kívül az előző figyelmeztetést, amely egy későbbi oktatóanyagban lesz javítva.

A PMC-eszközökkel kapcsolatos további információkért EF Corelásd EF Core az eszközökre vonatkozó referencia - PMC-t a Visual Studióban.

Az alkalmazás tesztelése

Futtassa az alkalmazást, és válassza a Filmalkalmazás hivatkozást.

Ha a következőhöz hasonló kivételt kap, előfordulhat, hogy a Update-Database kihagyta a parancsot:

SqlException: Cannot open database "MvcMovieContext-1" requested by the login. The login failed.

Note

Előfordulhat, hogy nem tud tizedesvesszőt beírni a Price mezőbe. Az olyan nem angol nyelvű területi beállítások jQuery-érvényesítésének támogatásához, amelyek vesszőt (",") használnak tizedesvesszőhöz és nem US-English dátumformátumokhoz, az alkalmazást globalizálni kell. A globalizációval kapcsolatos utasításokért tekintse meg a ésGitHub-problémát.

A létrehozott adatbázis környezeti osztályának és regisztrációjának vizsgálata

Ezzel EF Coreaz adathozzáférést egy modell használatával hajtja végre. A modell entitásosztályokból és környezeti objektumból áll, amelyek az adatbázissal való munkamenetet jelölik. A környezeti objektum lehetővé teszi az adatok lekérdezését és mentését. Az adatbázis-környezet a Microsoft.EntityFrameworkCore.DbContext fájlból származik, és megadja az adatmodellbe felvenni kívánt entitásokat.

Az állványzat létrehozza az Data/MvcMovieContext.cs adatbázis környezeti osztályát:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using MvcMovie.Models;

namespace MvcMovie.Data
{
    public class MvcMovieContext : DbContext
    {
        public MvcMovieContext (DbContextOptions<MvcMovieContext> options)
            : base(options)
        {
        }

        public DbSet<MvcMovie.Models.Movie> Movie { get; set; }
    }
}

Az előző kód létrehoz egy DbSet Movie< tulajdonságot>, amely az adatbázisban lévő filmeket jelöli.

Függőséginjektálás

ASP.NET Core függőséginjektálással (DI) épül fel. Az olyan szolgáltatások, mint az adatbázis-környezet, a DI-ben vannak regisztrálva.Program.cs Ezeket a szolgáltatásokat konstruktorparamétereken keresztül biztosítjuk azoknak az összetevőknek, amelyek megkövetelik őket.

A fájlban a Controllers/MoviesController.cs konstruktor függőséginjektálással injektálja az MvcMovieContext adatbázis-környezetet a vezérlőbe. Az adatbázis-környezet a vezérlőben található CRUD-metódusok mindegyikében használatos.

Az előzetes kódgenerálás a következő kiemelt kódot generálta a(z) Program.cs alatt.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

A ASP.NET Core konfigurációs rendszer beolvassa az "MvcMovieContext" adatbázis kapcsolati sztringet.

A létrehozott adatbázis kapcsolati sztringjének vizsgálata

Az állványzat hozzáadott egy kapcsolati karakterláncot a appsettings.json fájlhoz.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db"
  }
}

A helyi fejlesztéshez a ASP.NET Core konfigurációs rendszer beolvassa a ConnectionString kulcsot a appsettings.json fájlból.

Az InitialCreate osztály

Vizsgálja meg a migrálási Migrations/{timestamp}_InitialCreate.cs fájlt:

using System;
using Microsoft.EntityFrameworkCore.Migrations;

#nullable disable

namespace MvcMovie.Migrations
{
    public partial class InitialCreate : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "Movie",
                columns: table => new
                {
                    Id = table.Column<int>(type: "int", nullable: false)
                        .Annotation("SqlServer:Identity", "1, 1"),
                    Title = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    ReleaseDate = table.Column<DateTime>(type: "datetime2", nullable: false),
                    Genre = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Movie", x => x.Id);
                });
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "Movie");
        }
    }
}

Az előző kódban:

  • InitialCreate.Up létrehozza a Movie táblát Id , és elsődleges kulcsként konfigurálja.
  • InitialCreate.Down Visszaállítja a migrálás által végrehajtott sémamódosításokat Up .

Függőséginjektálás a vezérlőben

Nyissa meg a Controllers/MoviesController.cs fájlt, és vizsgálja meg a konstruktort:

public class MoviesController : Controller
{
    private readonly MvcMovieContext _context;

    public MoviesController(MvcMovieContext context)
    {
        _context = context;
    }

A konstruktor függőséginjektálással injektálja az adatbázis-környezetet (MvcMovieContext) a vezérlőbe. Az adatbázis-környezet a vezérlőben található CRUD-metódusok mindegyikében használatos.

Tesztelje a Létrehozás lapot. Adja meg és küldje el az adatokat.

Tesztelje a Szerkesztés, a Részletek és a Törlés lapot.

Erősen típusozott modellek és az @model irányelv

Az oktatóanyag korábbi részében láthatta, hogyan adhat át egy vezérlő adatokat vagy objektumokat egy nézetnek a ViewData szótár használatával. A ViewData szótár egy dinamikus objektum, amely kényelmes, késői kötésű módot biztosít az információk nézetbe való továbbítására.

Az MVC lehetővé teszi, hogy szorosan típusos modell objektumokat adjon át egy nézetnek. Ez a szigorúan típusos megközelítés lehetővé teszi a fordítási időben történő kód ellenőrzést. Az sablon mechanizmus egy erősen típusos modellt továbbított a MoviesController osztályban és nézetekben.

Vizsgálja meg a fájlban létrehozott Details metódust Controllers/MoviesController.cs :

// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    var movie = await _context.Movie
        .FirstOrDefaultAsync(m => m.Id == id);
    if (movie == null)
    {
        return NotFound();
    }

    return View(movie);
}

A id paramétert általában útvonaladatokként adjuk át. Például https://localhost:5001/movies/details/1 készletek:

  • A movies vezérlő első URL-szegmense a vezérlő számára.
  • A második URL-szegmensre irányuló detailsművelet.
  • A id 1-re van beállítva, az utolsó URL-szegmens.

A id lekérdezési sztringgel is átadható, ahogyan az alábbi példában is látható:

https://localhost:5001/movies/details?id=1

A id paraméter null értékű típusként (int?) van definiálva abban az esetben, ha az id érték nincs megadva.

Egy lambda kifejezést adnak át a FirstOrDefaultAsync metódusnak, hogy kiválassza azokat a mozgókép-entitásokat, amelyek megfelelnek az útvonali adatoknak vagy a lekérdezési karakterlánc értéknek.

var movie = await _context.Movie
    .FirstOrDefaultAsync(m => m.Id == id);

Ha egy filmet találunk, a Movie modell egy példányát átadjuk a Details nézetnek.

return View(movie);

Vizsgálja meg a Views/Movies/Details.cshtml fájl tartalmát:

@model MvcMovie.Models.Movie

@{
    ViewData["Title"] = "Details";
}

<h1>Details</h1>

<div>
    <h4>Movie</h4>
    <hr />
    <dl class="row">
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.Title)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.Title)
        </dd>
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.ReleaseDate)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.ReleaseDate)
        </dd>
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.Genre)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.Genre)
        </dd>
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.Price)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.Price)
        </dd>
    </dl>
</div>
<div>
    <a asp-action="Edit" asp-route-id="@Model.Id">Edit</a> |
    <a asp-action="Index">Back to List</a>
</div>

A @model nézetfájl tetején található utasítás határozza meg a nézet által várt objektum típusát. A filmvezérlő létrehozásakor a következő @model utasítás lett belefoglalva:

@model MvcMovie.Models.Movie

Ez az @model irányelv hozzáférést biztosít ahhoz a filmhez, amelyet a vezérlő átadott a nézetnek. Az Model objektum erősen be van gépelve. Például a Details.cshtml nézetben a kód átadja az egyes film mezőket az DisplayNameFor és DisplayFor HTML Segítőknek az erősen típusos Model objektummal. A Create metódusok és Edit nézetek egy modellobjektumot Movie is átadnak.

Vizsgálja meg a Index.cshtml nézetet és a metódust Index a Filmek vezérlőben. Figyelje meg, hogy a kód hogyan hoz létre objektumot List , amikor meghívja a metódust View . A kód a műveletmetódusból a Movies nézetbe továbbítja a Index listát:

// GET: Movies
public async Task<IActionResult> Index()
{
    return View(await _context.Movie.ToListAsync());
}

A kód a probléma részleteit adja vissza, ha az Movie adatkörnyezet tulajdonsága null.

A filmek vezérlőjének létrehozásakor a sablon a következő @model utasítást tartalmazta a Index.cshtml fájl tetején:

@model IEnumerable<MvcMovie.Models.Movie>

Az @model irányelv lehetővé teszi a filmek listájához való hozzáférést, amelyet a vezérlő egy erősen típusos Model objektummal adott át a nézetnek. A nézetben például a Index.cshtml kód egy utasítással foreach végighalad a filmeken az erősen gépelt Model objektumon:

@model IEnumerable<MvcMovie.Models.Movie>

@{
    ViewData["Title"] = "Index";
}

<h1>Index</h1>

<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ReleaseDate)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Genre)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Price)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Title)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ReleaseDate)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Genre)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Price)
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
                <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
            </td>
        </tr>
}
    </tbody>
</table>

Mivel az Model objektum erősen típusos IEnumerable<Movie> objektumként van típusosítva, a ciklus minden eleme Movie típusú. A fordító többek között ellenőrzi a kódban használt típusokat.

További erőforrások

Ebben az oktatóanyagban osztályokat adunk hozzá az adatbázisokban lévő filmek kezeléséhez. Ezek az osztályok az MVC alkalmazás "Model" része.

Ezek a modellosztályok az Entity Framework Core (EF Core) használatával működnek együtt egy adatbázissal. EF Core Egy objektum-relációs leképezési (ORM) keretrendszer, amely leegyszerűsíti az írandó adatelérési kódot.

A létrehozott modellosztályokat POCO-osztályoknak nevezzük a Plain Old CLR Objectsből. A POCO-osztályok nem függenek a EF Core. Csak az adatbázisban tárolandó adatok tulajdonságait határozzák meg.

Ebben az oktatóanyagban a modellosztályok jönnek létre először, és EF Core létrehozza az adatbázist.

Adatmodell-osztály hozzáadása

Kattintson a jobb gombbal a Models mappára >Hozzáadás>Osztály. A fájl neve legyen Movie.cs.

Frissítse a Models/Movie.cs fájlt a következő kóddal:

using System.ComponentModel.DataAnnotations;

namespace MvcMovie.Models;

public class Movie
{
    public int Id { get; set; }
    public string? Title { get; set; }
    [DataType(DataType.Date)]
    public DateTime ReleaseDate { get; set; }
    public string? Genre { get; set; }
    public decimal Price { get; set; }
}

Az Movie osztály tartalmaz egy Id mezőt, amelyet az adatbázis az elsődleges kulcshoz szükséges.

A DataType rajta lévő ReleaseDate attribútum megadja az adatok típusát (Date). Ezzel az attribútummal:

  • A felhasználónak nem kell időadatokat megadnia a dátum mezőben.
  • Csak a dátum jelenik meg, az időadatok nem.

A DataAnnotations egy későbbi oktatóanyagban kerülnek tárgyalásra.

Az string utáni kérdőjel azt jelzi, hogy a tulajdonság null értékű. További információért tekintse meg: Null értékű hivatkozástípusok.

NuGet-csomagok hozzáadása

A Visual Studio automatikusan telepíti a szükséges csomagokat.

Állítsa össze a projektet fordítóhibák ellenőrzéseként.

Filmoldalak előkészítése

Használja a keretrendszer eszközt a Create, Read, Update, és Delete (CRUD) oldalak készítéséhez a film modell számára.

A Megoldáskezelőben kattintson a jobb gombbal a Vezérlők mappára, és válassza az Új állványozott elem hozzáadása >lehetőséget.

a fenti lépés nézete

Az Új vázolt elem hozzáadása párbeszédpanelen:

  • A bal oldali panelen válassza a Telepített>közös>MVC lehetőséget.
  • Válassza ki a nézetekkel rendelkező MVC-vezérlőt az Entity Framework használatával.
  • Válassza a Hozzáadás lehetőséget.

Állványzat hozzáadása párbeszédpanel

Töltse ki az Entity Frameworköt használó nézetekkel rendelkező MVC-vezérlő hozzáadása párbeszédpanelt:

  • A Modell osztály legördülő menüjében válassza a Mozgókép (MvcMovie.Models) lehetőséget.
  • Az Data context class sorban válassza ki a + (plusz) jelet.
    • Az Adatkörnyezet hozzáadása párbeszédpanelen létre jön az MvcMovie.Data.MvcMovieContext osztálynév.
    • Válassza a Hozzáadás lehetőséget.
  • Az Adatbázis-szolgáltató legördülő listában válassza SQL Serverlehetőséget.
  • Nézetek és vezérlő neve: Tartsa meg az alapértelmezett értéket.
  • Válassza a Hozzáadás lehetőséget.

Adatkörnyezet hozzáadása – alapértelmezett értékek megtartása Ha hibaüzenet jelenik meg, válassza az Add a second time to try it again (Második próbálkozás hozzáadása) lehetőséget.

Az állványzat a következő csomagokat adja hozzá:

  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.Tools
  • Microsoft.VisualStudio.Web.CodeGeneration.Design

Az állványzat a következőket hozza létre:

  • Filmvezérlő: Controllers/MoviesController.cs
  • Razor fájlok megtekintése létrehozási, törlési, részleteki, szerkesztési és indexelési lapokhoz: Views/Movies/*.cshtml
  • Adatbázis környezeti osztálya: Data/MvcMovieContext.cs

Az állványzat a következőket frissíti:

  • Beszúrja a szükséges csomaghivatkozásokat a MvcMovie.csproj projektfájlba.
  • Regisztrálja az adatbázis-környezetet a Program.cs fájlban.
  • Hozzáad egy adatbázis-kapcsolati sztringet a appsettings.json fájlhoz.

Ezeknek a fájloknak és fájlfrissítéseknek az automatikus létrehozását állványzatnak nevezzük.

Az állványozott lapok még nem használhatók, mert az adatbázis nem létezik. Az alkalmazás futtatása és a Filmalkalmazás hivatkozásra történő kattintás az adatbázis nem nyitható meg vagy nincs ilyen tábla: Movie hibaüzenetet eredményez.

Hozza létre az alkalmazást annak ellenőrzéséhez, hogy nincsenek-e hibák.

Kezdeti migrálás

Az adatbázis létrehozásához használja a EF CoreMigrálás funkciót . A migráció egy olyan eszközkészlet, amely létrehoz és frissít egy adatbázist az adatmodellel összhangban.

Az Eszközök menüben válassza a NuGet Package Manager Csomagkezelő>konzolt .

A Package Manager-konzolon (PMC) adja meg a következő parancsokat:

Add-Migration InitialCreate
Update-Database

  • Add-Migration InitialCreate: Migrálási Migrations/{timestamp}_InitialCreate.cs fájlt hoz létre. A InitialCreate argumentum a migráció neve. Bármilyen név használható, de konvenció szerint az áttelepítést leíró név van kiválasztva. Mivel ez az első migrálás, a létrehozott osztály az adatbázisséma létrehozásához szükséges kódot tartalmazza. Az adatbázisséma az osztályban MvcMovieContext megadott modellen alapul.

  • Update-Database: Frissíti az adatbázist a legújabb migrálásra, amelyet az előző parancs hozott létre. Ez a parancs futtatja a metódust Up a Migrations/{time-stamp}_InitialCreate.cs fájlban, amely létrehozza az adatbázist.

A Update-Database parancs a következő figyelmeztetést hozza létre:

Nem adott meg típust a "Movie" entitástípus "Ár" tizedesoszlopához. Ez az értékek csonkolásához vezet, ha nem illeszkednek az alapértelmezett pontossághoz és mértékhez. Explicit módon adja meg azt az SQL Server-oszloptípust, amely a "HasColumnType()" használatával minden értéket el tud fogadni.

Hagyja figyelmen kívül az előző figyelmeztetést, amely egy későbbi oktatóanyagban lesz javítva.

A PMC-eszközökkel kapcsolatos további információkért EF Corelásd EF Core az eszközökre vonatkozó referencia - PMC-t a Visual Studióban.

Az alkalmazás tesztelése

Futtassa az alkalmazást, és válassza a Filmalkalmazás hivatkozást.

Ha a következőhöz hasonló kivételt kap, előfordulhat, hogy a Update-Database kihagyta a parancsot:

SqlException: Cannot open database "MvcMovieContext-1" requested by the login. The login failed.

Note

Előfordulhat, hogy nem tud tizedesvesszőt beírni a Price mezőbe. Az olyan nem angol nyelvű területi beállítások jQuery-érvényesítésének támogatásához, amelyek vesszőt (",") használnak tizedesvesszőhöz és nem US-English dátumformátumokhoz, az alkalmazást globalizálni kell. A globalizációval kapcsolatos utasításokért tekintse meg a ésGitHub-problémát.

A létrehozott adatbázis környezeti osztályának és regisztrációjának vizsgálata

Ezzel EF Coreaz adathozzáférést egy modell használatával hajtja végre. A modell entitásosztályokból és környezeti objektumból áll, amelyek az adatbázissal való munkamenetet jelölik. A környezeti objektum lehetővé teszi az adatok lekérdezését és mentését. Az adatbázis-környezet a Microsoft.EntityFrameworkCore.DbContext fájlból származik, és megadja az adatmodellbe felvenni kívánt entitásokat.

Az állványzat létrehozza az Data/MvcMovieContext.cs adatbázis környezeti osztályát:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using MvcMovie.Models;

namespace MvcMovie.Data
{
    public class MvcMovieContext : DbContext
    {
        public MvcMovieContext (DbContextOptions<MvcMovieContext> options)
            : base(options)
        {
        }

        public DbSet<MvcMovie.Models.Movie> Movie { get; set; }
    }
}

Az előző kód létrehoz egy DbSet Movie< tulajdonságot>, amely az adatbázisban lévő filmeket jelöli.

Függőséginjektálás

ASP.NET Core függőséginjektálással (DI) épül fel. Az olyan szolgáltatások, mint az adatbázis-környezet, a DI-ben vannak regisztrálva.Program.cs Ezeket a szolgáltatásokat konstruktorparamétereken keresztül biztosítjuk azoknak az összetevőknek, amelyek megkövetelik őket.

A fájlban a Controllers/MoviesController.cs konstruktor függőséginjektálással injektálja az MvcMovieContext adatbázis-környezetet a vezérlőbe. Az adatbázis-környezet a vezérlőben található CRUD-metódusok mindegyikében használatos.

Az előzetes kódgenerálás a következő kiemelt kódot generálta a(z) Program.cs alatt.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

A ASP.NET Core konfigurációs rendszer beolvassa az "MvcMovieContext" adatbázis kapcsolati sztringet.

A létrehozott adatbázis kapcsolati sztringjének vizsgálata

Az állványzat hozzáadott egy kapcsolati karakterláncot a appsettings.json fájlhoz.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db"
  }
}

A helyi fejlesztéshez a ASP.NET Core konfigurációs rendszer beolvassa a ConnectionString kulcsot a appsettings.json fájlból.

Az InitialCreate osztály

Vizsgálja meg a migrálási Migrations/{timestamp}_InitialCreate.cs fájlt:

using System;
using Microsoft.EntityFrameworkCore.Migrations;

#nullable disable

namespace MvcMovie.Migrations
{
    public partial class InitialCreate : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "Movie",
                columns: table => new
                {
                    Id = table.Column<int>(type: "int", nullable: false)
                        .Annotation("SqlServer:Identity", "1, 1"),
                    Title = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    ReleaseDate = table.Column<DateTime>(type: "datetime2", nullable: false),
                    Genre = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Movie", x => x.Id);
                });
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "Movie");
        }
    }
}

Az előző kódban:

  • InitialCreate.Up létrehozza a Movie táblát Id , és elsődleges kulcsként konfigurálja.
  • InitialCreate.Down Visszaállítja a migrálás által végrehajtott sémamódosításokat Up .

Függőséginjektálás a vezérlőben

Nyissa meg a Controllers/MoviesController.cs fájlt, és vizsgálja meg a konstruktort:

public class MoviesController : Controller
{
    private readonly MvcMovieContext _context;

    public MoviesController(MvcMovieContext context)
    {
        _context = context;
    }

A konstruktor függőséginjektálással injektálja az adatbázis-környezetet (MvcMovieContext) a vezérlőbe. Az adatbázis-környezet a vezérlőben található CRUD-metódusok mindegyikében használatos.

Tesztelje a Létrehozás lapot. Adja meg és küldje el az adatokat.

Tesztelje a Szerkesztés, a Részletek és a Törlés lapot.

Erősen típusozott modellek és az @model irányelv

Az oktatóanyag korábbi részében láthatta, hogyan adhat át egy vezérlő adatokat vagy objektumokat egy nézetnek a ViewData szótár használatával. A ViewData szótár egy dinamikus objektum, amely kényelmes, késői kötésű módot biztosít az információk nézetbe való továbbítására.

Az MVC lehetővé teszi, hogy szorosan típusos modell objektumokat adjon át egy nézetnek. Ez a szigorúan típusos megközelítés lehetővé teszi a fordítási időben történő kód ellenőrzést. Az sablon mechanizmus egy erősen típusos modellt továbbított a MoviesController osztályban és nézetekben.

Vizsgálja meg a fájlban létrehozott Details metódust Controllers/MoviesController.cs :

// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    var movie = await _context.Movie
        .FirstOrDefaultAsync(m => m.Id == id);
    if (movie == null)
    {
        return NotFound();
    }

    return View(movie);
}

A id paramétert általában útvonaladatokként adjuk át. Például https://localhost:5001/movies/details/1 készletek:

  • A movies vezérlő első URL-szegmense a vezérlő számára.
  • A második URL-szegmensre irányuló detailsművelet.
  • A id 1-re van beállítva, az utolsó URL-szegmens.

A id lekérdezési sztringgel is átadható, ahogyan az alábbi példában is látható:

https://localhost:5001/movies/details?id=1

A id paraméter null értékű típusként (int?) van definiálva abban az esetben, ha az id érték nincs megadva.

Egy lambda kifejezést adnak át a FirstOrDefaultAsync metódusnak, hogy kiválassza azokat a mozgókép-entitásokat, amelyek megfelelnek az útvonali adatoknak vagy a lekérdezési karakterlánc értéknek.

var movie = await _context.Movie
    .FirstOrDefaultAsync(m => m.Id == id);

Ha egy filmet találunk, a Movie modell egy példányát átadjuk a Details nézetnek.

return View(movie);

Vizsgálja meg a Views/Movies/Details.cshtml fájl tartalmát:

@model MvcMovie.Models.Movie

@{
    ViewData["Title"] = "Details";
}

<h1>Details</h1>

<div>
    <h4>Movie</h4>
    <hr />
    <dl class="row">
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.Title)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.Title)
        </dd>
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.ReleaseDate)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.ReleaseDate)
        </dd>
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.Genre)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.Genre)
        </dd>
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.Price)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.Price)
        </dd>
    </dl>
</div>
<div>
    <a asp-action="Edit" asp-route-id="@Model.Id">Edit</a> |
    <a asp-action="Index">Back to List</a>
</div>

A @model nézetfájl tetején található utasítás határozza meg a nézet által várt objektum típusát. A filmvezérlő létrehozásakor a következő @model utasítás lett belefoglalva:

@model MvcMovie.Models.Movie

Ez az @model irányelv hozzáférést biztosít ahhoz a filmhez, amelyet a vezérlő átadott a nézetnek. Az Model objektum erősen be van gépelve. Például a Details.cshtml nézetben a kód átadja az egyes film mezőket az DisplayNameFor és DisplayFor HTML Segítőknek az erősen típusos Model objektummal. A Create metódusok és Edit nézetek egy modellobjektumot Movie is átadnak.

Vizsgálja meg a Index.cshtml nézetet és a metódust Index a Filmek vezérlőben. Figyelje meg, hogy a kód hogyan hoz létre objektumot List , amikor meghívja a metódust View . A kód a műveletmetódusból a Movies nézetbe továbbítja a Index listát:

// GET: Movies
public async Task<IActionResult> Index()
{
    return View(await _context.Movie.ToListAsync());
}

A kód a probléma részleteit adja vissza, ha az Movie adatkörnyezet tulajdonsága null.

A filmek vezérlőjének létrehozásakor a sablon a következő @model utasítást tartalmazta a Index.cshtml fájl tetején:

@model IEnumerable<MvcMovie.Models.Movie>

Az @model irányelv lehetővé teszi a filmek listájához való hozzáférést, amelyet a vezérlő egy erősen típusos Model objektummal adott át a nézetnek. A nézetben például a Index.cshtml kód egy utasítással foreach végighalad a filmeken az erősen gépelt Model objektumon:

@model IEnumerable<MvcMovie.Models.Movie>

@{
    ViewData["Title"] = "Index";
}

<h1>Index</h1>

<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ReleaseDate)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Genre)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Price)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Title)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ReleaseDate)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Genre)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Price)
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
                <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
            </td>
        </tr>
}
    </tbody>
</table>

Mivel az Model objektum erősen típusos IEnumerable<Movie> objektumként van típusosítva, a ciklus minden eleme Movie típusú. A fordító többek között ellenőrzi a kódban használt típusokat.

További erőforrások

Ebben az oktatóanyagban osztályokat adunk hozzá az adatbázisokban lévő filmek kezeléséhez. Ezek az osztályok az MVC alkalmazás "Model" része.

Ezek a modellosztályok az Entity Framework Core (EF Core) használatával működnek együtt egy adatbázissal. EF Core Egy objektum-relációs leképezési (ORM) keretrendszer, amely leegyszerűsíti az írandó adatelérési kódot.

A létrehozott modellosztályokat POCO-osztályoknak nevezzük a Plain Old CLR Objectsből. A POCO-osztályok nem függenek a EF Core. Csak az adatbázisban tárolandó adatok tulajdonságait határozzák meg.

Ebben az oktatóanyagban a modellosztályok jönnek létre először, és EF Core létrehozza az adatbázist.

Adatmodell-osztály hozzáadása

Kattintson a jobb gombbal a Models mappára >Hozzáadás>Osztály. A fájl neve legyen Movie.cs.

Frissítse a Models/Movie.cs fájlt a következő kóddal:

using System.ComponentModel.DataAnnotations;

namespace MvcMovie.Models
{
    public class Movie
    {
        public int Id { get; set; }
        public string? Title { get; set; }

        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string? Genre { get; set; }
        public decimal Price { get; set; }
    }
}

Az Movie osztály tartalmaz egy Id mezőt, amelyet az adatbázis az elsődleges kulcshoz szükséges.

A DataType rajta lévő ReleaseDate attribútum megadja az adatok típusát (Date). Ezzel az attribútummal:

  • A felhasználónak nem kell időadatokat megadnia a dátum mezőben.
  • Csak a dátum jelenik meg, az időadatok nem.

A DataAnnotations egy későbbi oktatóanyagban kerülnek tárgyalásra.

Az string utáni kérdőjel azt jelzi, hogy a tulajdonság null értékű. További információért tekintse meg: Null értékű hivatkozástípusok.

NuGet-csomagok hozzáadása

Az Eszközök menüben válassza a NuGet Package Manager Csomagkezelő>konzol (PMC) lehetőséget.

PMC menü

A PMC-ben futtassa a következő parancsot:

Install-Package Microsoft.EntityFrameworkCore.Design
Install-Package Microsoft.EntityFrameworkCore.SqlServer

Az előző parancsok hozzáadják a következőt:

  • Az EF Core SQL Server-szolgáltató. A szolgáltatói csomag függőségként telepíti a EF Core csomagot.
  • Az állványozási lépésben, az oktatóanyag későbbi részében automatikusan telepített csomagok által használt segédprogramok.

Állítsa össze a projektet fordítóhibák ellenőrzéseként.

Filmoldalak előkészítése

Használja a keretrendszer eszközt a Create, Read, Update, és Delete (CRUD) oldalak készítéséhez a film modell számára.

A Megoldáskezelőben kattintson a jobb gombbal a Vezérlők mappára, és válassza az Új állványozott elem hozzáadása >lehetőséget.

a fenti lépés nézete

Az Állványzat hozzáadása párbeszédpanelen válassza a nézetekkel rendelkező MVC-vezérlőt az Entity Framework > Add paranccsal.

Állványzat hozzáadása párbeszédpanel

Töltse ki az Entity Frameworköt használó nézetekkel rendelkező MVC-vezérlő hozzáadása párbeszédpanelt:

  • A Modell osztály legördülő menüjében válassza a Mozgókép (MvcMovie.Models) lehetőséget.
  • Az Data context class sorban válassza ki a + (plusz) jelet.
    • Az Adatkörnyezet hozzáadása párbeszédpanelen létre jön az MvcMovie.Data.MvcMovieContext osztálynév.
    • Válassza a Hozzáadás lehetőséget.
  • Nézetek és vezérlő neve: Tartsa meg az alapértelmezett értéket.
  • Válassza a Hozzáadás lehetőséget.

Adatkörnyezet hozzáadása – alapértelmezett értékek megtartása

Ha hibaüzenet jelenik meg, válassza az Add a second time to try it again (Második próbálkozás hozzáadása) lehetőséget.

Az állványzat a következőket frissíti:

  • Beszúrja a szükséges csomaghivatkozásokat a MvcMovie.csproj projektfájlba.
  • Regisztrálja az adatbázis-környezetet a Program.cs fájlban.
  • Hozzáad egy adatbázis-kapcsolati sztringet a appsettings.json fájlhoz.

Az állványzat a következőket hozza létre:

  • Filmvezérlő: Controllers/MoviesController.cs
  • Razor fájlok megtekintése létrehozási, törlési, részleteki, szerkesztési és indexelési lapokhoz: Views/Movies/*.cshtml
  • Adatbázis környezeti osztálya: Data/MvcMovieContext.cs

Ezeknek a fájloknak és fájlfrissítéseknek az automatikus létrehozását állványzatnak nevezzük.

Az állványozott lapok még nem használhatók, mert az adatbázis nem létezik. Az alkalmazás futtatása és a Filmalkalmazás hivatkozásra történő kattintás az adatbázis nem nyitható meg vagy nincs ilyen tábla: Movie hibaüzenetet eredményez.

Az alkalmazás létrehozása

Hozza létre az alkalmazást. A fordítóprogram számos figyelmeztetést generál az értékek kezelésének módjáról null . További információért tekintse meg ezt a GitHub-problémát és a Nullable referenciatípusokat .

A null értékű hivatkozástípusok figyelmeztetéseinek eltávolításához távolítsa el a következő sort a MvcMovie.csproj fájlból:

<Nullable>enable</Nullable>

Reméljük, hogy a következő kiadásban kijavítjuk ezt a problémát.

Kezdeti migrálás

Az adatbázis létrehozásához használja a EF CoreMigrálás funkciót . A migráció egy olyan eszközkészlet, amely létrehoz és frissít egy adatbázist az adatmodellel összhangban.

Az Eszközök menüben válassza a NuGet Package Manager Csomagkezelő>konzolt .

A Package Manager-konzolon (PMC) adja meg a következő parancsokat:

Add-Migration InitialCreate
Update-Database

  • Add-Migration InitialCreate: Migrálási Migrations/{timestamp}_InitialCreate.cs fájlt hoz létre. A InitialCreate argumentum a migráció neve. Bármilyen név használható, de konvenció szerint az áttelepítést leíró név van kiválasztva. Mivel ez az első migrálás, a létrehozott osztály az adatbázisséma létrehozásához szükséges kódot tartalmazza. Az adatbázisséma az osztályban MvcMovieContext megadott modellen alapul.

  • Update-Database: Frissíti az adatbázist a legújabb migrálásra, amelyet az előző parancs hozott létre. Ez a parancs futtatja a metódust Up a Migrations/{time-stamp}_InitialCreate.cs fájlban, amely létrehozza az adatbázist.

A Update-Database parancs a következő figyelmeztetést hozza létre:

Nem adott meg típust a "Movie" entitástípus "Ár" tizedesoszlopához. Ez az értékek csonkolásához vezet, ha nem illeszkednek az alapértelmezett pontossághoz és mértékhez. Explicit módon adja meg azt az SQL Server-oszloptípust, amely a "HasColumnType()" használatával minden értéket el tud fogadni.

Hagyja figyelmen kívül az előző figyelmeztetést, amely egy későbbi oktatóanyagban lesz javítva.

A PMC-eszközökkel kapcsolatos további információkért EF Corelásd EF Core az eszközökre vonatkozó referencia - PMC-t a Visual Studióban.

Az alkalmazás tesztelése

Futtassa az alkalmazást, és válassza a Filmalkalmazás hivatkozást.

Ha a következőhöz hasonló kivételt kap, előfordulhat, hogy elmulasztotta a migrálási lépést:

SqlException: Cannot open database "MvcMovieContext-1" requested by the login. The login failed.

Note

Előfordulhat, hogy nem tud tizedesvesszőt beírni a Price mezőbe. Az olyan nem angol nyelvű területi beállítások jQuery-érvényesítésének támogatásához, amelyek vesszőt (",") használnak tizedesvesszőhöz és nem US-English dátumformátumokhoz, az alkalmazást globalizálni kell. A globalizációval kapcsolatos utasításokért tekintse meg a ésGitHub-problémát.

A létrehozott adatbázis környezeti osztályának és regisztrációjának vizsgálata

Ezzel EF Coreaz adathozzáférést egy modell használatával hajtja végre. A modell entitásosztályokból és környezeti objektumból áll, amelyek az adatbázissal való munkamenetet jelölik. A környezeti objektum lehetővé teszi az adatok lekérdezését és mentését. Az adatbázis-környezet a Microsoft.EntityFrameworkCore.DbContext fájlból származik, és megadja az adatmodellbe felvenni kívánt entitásokat.

Az állványzat létrehozza az Data/MvcMovieContext.cs adatbázis környezeti osztályát:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using MvcMovie.Models;

namespace MvcMovie.Data
{
    public class MvcMovieContext : DbContext
    {
        public MvcMovieContext (DbContextOptions<MvcMovieContext> options)
            : base(options)
        {
        }

        public DbSet<MvcMovie.Models.Movie> Movie { get; set; }
    }
}

Az előző kód létrehoz egy DbSet Movie< tulajdonságot>, amely az adatbázisban lévő filmeket jelöli.

Függőséginjektálás

ASP.NET Core függőséginjektálással (DI) épül fel. Az olyan szolgáltatások, mint az adatbázis-környezet, a DI-ben vannak regisztrálva.Program.cs Ezeket a szolgáltatásokat konstruktorparamétereken keresztül biztosítjuk azoknak az összetevőknek, amelyek megkövetelik őket.

A fájlban a Controllers/MoviesController.cs konstruktor függőséginjektálással injektálja az MvcMovieContext adatbázis-környezetet a vezérlőbe. Az adatbázis-környezet a vezérlőben található CRUD-metódusok mindegyikében használatos.

Az előzetes kódgenerálás a következő kiemelt kódot generálta a(z) Program.cs alatt.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

A ASP.NET Core konfigurációs rendszer beolvassa az "MvcMovieContext" adatbázis kapcsolati sztringet.

A létrehozott adatbázis kapcsolati sztringjének vizsgálata

Az állványzat hozzáadott egy kapcsolati karakterláncot a appsettings.json fájlhoz.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-7dc5;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

A helyi fejlesztéshez a ASP.NET Core konfigurációs rendszer beolvassa a ConnectionString kulcsot a appsettings.json fájlból.

Az InitialCreate osztály

Vizsgálja meg a migrálási Migrations/{timestamp}_InitialCreate.cs fájlt:

using System;
using Microsoft.EntityFrameworkCore.Migrations;

#nullable disable

namespace MvcMovie.Migrations
{
    public partial class InitialCreate : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "Movie",
                columns: table => new
                {
                    Id = table.Column<int>(type: "int", nullable: false)
                        .Annotation("SqlServer:Identity", "1, 1"),
                    Title = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    ReleaseDate = table.Column<DateTime>(type: "datetime2", nullable: false),
                    Genre = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Movie", x => x.Id);
                });
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "Movie");
        }
    }
}

Az előző kódban:

  • InitialCreate.Up létrehozza a Movie táblát Id , és elsődleges kulcsként konfigurálja.
  • InitialCreate.Down Visszaállítja a migrálás által végrehajtott sémamódosításokat Up .

Függőséginjektálás a vezérlőben

Nyissa meg a Controllers/MoviesController.cs fájlt, és vizsgálja meg a konstruktort:

public class MoviesController : Controller
{
    private readonly MvcMovieContext _context;

    public MoviesController(MvcMovieContext context)
    {
        _context = context;
    }

A konstruktor függőséginjektálással injektálja az adatbázis-környezetet (MvcMovieContext) a vezérlőbe. Az adatbázis-környezet a vezérlőben található CRUD-metódusok mindegyikében használatos.

Tesztelje a Létrehozás lapot. Adja meg és küldje el az adatokat.

Tesztelje a Szerkesztés, a Részletek és a Törlés lapot.

Erősen típusozott modellek és az @model irányelv

Az oktatóanyag korábbi részében láthatta, hogyan adhat át egy vezérlő adatokat vagy objektumokat egy nézetnek a ViewData szótár használatával. A ViewData szótár egy dinamikus objektum, amely kényelmes, késői kötésű módot biztosít az információk nézetbe való továbbítására.

Az MVC lehetővé teszi, hogy szorosan típusos modell objektumokat adjon át egy nézetnek. Ez a szigorúan típusos megközelítés lehetővé teszi a fordítási időben történő kód ellenőrzést. Az sablon mechanizmus egy erősen típusos modellt továbbított a MoviesController osztályban és nézetekben.

Vizsgálja meg a fájlban létrehozott Details metódust Controllers/MoviesController.cs :

// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    var movie = await _context.Movie
        .FirstOrDefaultAsync(m => m.Id == id);
    if (movie == null)
    {
        return NotFound();
    }

    return View(movie);
}

A id paramétert általában útvonaladatokként adjuk át. Például https://localhost:5001/movies/details/1 készletek:

  • A movies vezérlő első URL-szegmense a vezérlő számára.
  • A második URL-szegmensre irányuló detailsművelet.
  • A id 1-re van beállítva, az utolsó URL-szegmens.

A id lekérdezési sztringgel is átadható, ahogyan az alábbi példában is látható:

https://localhost:5001/movies/details?id=1

A id paraméter null értékű típusként (int?) van definiálva abban az esetben, ha az id érték nincs megadva.

Egy lambda kifejezést adnak át a FirstOrDefaultAsync metódusnak, hogy kiválassza azokat a mozgókép-entitásokat, amelyek megfelelnek az útvonali adatoknak vagy a lekérdezési karakterlánc értéknek.

var movie = await _context.Movie
    .FirstOrDefaultAsync(m => m.Id == id);

Ha egy filmet találunk, a Movie modell egy példányát átadjuk a Details nézetnek.

return View(movie);

Vizsgálja meg a Views/Movies/Details.cshtml fájl tartalmát:

@model MvcMovie.Models.Movie

@{
    ViewData["Title"] = "Details";
}

<h1>Details</h1>

<div>
    <h4>Movie</h4>
    <hr />
    <dl class="row">
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.Title)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.Title)
        </dd>
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.ReleaseDate)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.ReleaseDate)
        </dd>
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.Genre)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.Genre)
        </dd>
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.Price)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.Price)
        </dd>
    </dl>
</div>
<div>
    <a asp-action="Edit" asp-route-id="@Model.Id">Edit</a> |
    <a asp-action="Index">Back to List</a>
</div>

A @model nézetfájl tetején található utasítás határozza meg a nézet által várt objektum típusát. A filmvezérlő létrehozásakor a következő @model utasítás lett belefoglalva:

@model MvcMovie.Models.Movie

Ez az @model irányelv hozzáférést biztosít ahhoz a filmhez, amelyet a vezérlő átadott a nézetnek. Az Model objektum erősen be van gépelve. Például a Details.cshtml nézetben a kód átadja az egyes film mezőket az DisplayNameFor és DisplayFor HTML Segítőknek az erősen típusos Model objektummal. A Create metódusok és Edit nézetek egy modellobjektumot Movie is átadnak.

Vizsgálja meg a Index.cshtml nézetet és a metódust Index a Filmek vezérlőben. Figyelje meg, hogy a kód hogyan hoz létre objektumot List , amikor meghívja a metódust View . A kód a műveletmetódusból a Movies nézetbe továbbítja a Index listát:

// GET: Movies
public async Task<IActionResult> Index()
{
    return View(await _context.Movie.ToListAsync());
}

A filmek vezérlőjének létrehozásakor a sablon a következő @model utasítást tartalmazta a Index.cshtml fájl tetején:

@model IEnumerable<MvcMovie.Models.Movie>

Az @model irányelv lehetővé teszi a filmek listájához való hozzáférést, amelyet a vezérlő egy erősen típusos Model objektummal adott át a nézetnek. A nézetben például a Index.cshtml kód egy utasítással foreach végighalad a filmeken az erősen gépelt Model objektumon:

@model IEnumerable<MvcMovie.Models.Movie>

@{
    ViewData["Title"] = "Index";
}

<h1>Index</h1>

<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ReleaseDate)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Genre)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Price)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Title)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ReleaseDate)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Genre)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Price)
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
                <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
            </td>
        </tr>
}
    </tbody>
</table>

Mivel az Model objektum erősen típusos IEnumerable<Movie> objektumként van típusosítva, a ciklus minden eleme Movie típusú. A fordító többek között ellenőrzi a kódban használt típusokat.

További erőforrások

Ebben az oktatóanyagban osztályokat adunk hozzá az adatbázisokban lévő filmek kezeléséhez. Ezek az osztályok az MVC alkalmazás "Model" része.

Ezek a modellosztályok az Entity Framework Core (EF Core) használatával működnek együtt egy adatbázissal. EF Core Egy objektum-relációs leképezési (ORM) keretrendszer, amely leegyszerűsíti az írandó adatelérési kódot.

A létrehozott modellosztályokat POCO-osztályoknak nevezzük a Plain Old CLR Objectsből. A POCO-osztályok nem függenek a EF Core. Csak az adatbázisban tárolandó adatok tulajdonságait határozzák meg.

Ebben az oktatóanyagban a modellosztályok jönnek létre először, és EF Core létrehozza az adatbázist.

Adatmodell-osztály hozzáadása

Kattintson a jobb gombbal a Models mappára >Hozzáadás>Osztály. A fájl neve legyen Movie.cs.

Frissítse a Models/Movie.cs fájlt a következő kóddal:

using System;
using System.ComponentModel.DataAnnotations;

namespace MvcMovie.Models
{
    public class Movie
    {
        public int Id { get; set; }
        public string Title { get; set; }

        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
        public decimal Price { get; set; }
    }
}

Az Movie osztály tartalmaz egy Id mezőt, amelyet az adatbázis az elsődleges kulcshoz szükséges.

A DataType rajta lévő ReleaseDate attribútum megadja az adatok típusát (Date). Ezzel az attribútummal:

  • A felhasználónak nem kell időadatokat megadnia a dátum mezőben.
  • Csak a dátum jelenik meg, az időadatok nem.

A DataAnnotations egy későbbi oktatóanyagban kerülnek tárgyalásra.

NuGet-csomagok hozzáadása

Az Eszközök menüben válassza a NuGet Package Manager Csomagkezelő>konzol (PMC) lehetőséget.

PMC menü

A PMC-ben futtassa a következő parancsot:

Install-Package Microsoft.EntityFrameworkCore.Design

Az előző parancsok hozzáadják a következőt:

  • Az EF Core SQL Server-szolgáltató. A szolgáltatói csomag függőségként telepíti a EF Core csomagot.
  • Az állványozási lépésben, az oktatóanyag későbbi részében automatikusan telepített csomagok által használt segédprogramok.

Állítsa össze a projektet fordítóhibák ellenőrzéseként.

Filmoldalak előkészítése

Használja a keretrendszer eszközt a Create, Read, Update, és Delete (CRUD) oldalak készítéséhez a film modell számára.

A Megoldáskezelőben kattintson a jobb gombbal a Vezérlők mappára, és válassza az Új állványozott elem hozzáadása >lehetőséget.

a fenti lépés nézete

Az Állványzat hozzáadása párbeszédpanelen válassza a nézetekkel rendelkező MVC-vezérlőt az Entity Framework > Add paranccsal.

Állványzat hozzáadása párbeszédpanel

Töltse ki az Entity Frameworköt használó nézetekkel rendelkező MVC-vezérlő hozzáadása párbeszédpanelt:

  • A Modell osztály legördülő menüjében válassza a Mozgókép (MvcMovie.Models) lehetőséget.
  • Az Data context class sorban válassza ki a + (plusz) jelet.
    • Az Adatkörnyezet hozzáadása párbeszédpanelen létre jön az MvcMovie.Data.MvcMovieContext osztálynév.
    • Válassza a Hozzáadás lehetőséget.
  • Nézetek és vezérlő neve: Tartsa meg az alapértelmezett értéket.
  • Válassza a Hozzáadás lehetőséget.

Adatkörnyezet hozzáadása – alapértelmezett értékek megtartása

Az állványzat a következőket frissíti:

  • Beszúrja a szükséges csomaghivatkozásokat a MvcMovie.csproj projektfájlba.
  • Regisztrálja az adatbázis-környezetet a Startup.ConfigureServices fájlbanStartup.cs.
  • Hozzáad egy adatbázis-kapcsolati sztringet a appsettings.json fájlhoz.

Az állványzat a következőket hozza létre:

  • Filmvezérlő: Controllers/MoviesController.cs
  • Razor fájlok megtekintése létrehozási, törlési, részleteki, szerkesztési és indexelési lapokhoz: Views/Movies/*.cshtml
  • Adatbázis környezeti osztálya: Data/MvcMovieContext.cs

Ezeknek a fájloknak és fájlfrissítéseknek az automatikus létrehozását állványzatnak nevezzük.

Az állványozott lapok még nem használhatók, mert az adatbázis nem létezik. Az alkalmazás futtatása és a Filmalkalmazás hivatkozásra történő kattintás az adatbázis nem nyitható meg vagy nincs ilyen tábla: Movie hibaüzenetet eredményez.

Kezdeti migrálás

Az adatbázis létrehozásához használja a EF CoreMigrálás funkciót . A migrálások olyan eszközök, amelyek létrehoznak és frissítenek egy adatbázist az adatmodellnek megfelelően.

Az Eszközök menüben válassza a NuGet Package Manager Csomagkezelő>konzolt .

A Package Manager-konzolon (PMC) adja meg a következő parancsokat:

Add-Migration InitialCreate
Update-Database

  • Add-Migration InitialCreate: Migrálási Migrations/{timestamp}_InitialCreate.cs fájlt hoz létre. A InitialCreate argumentum a migráció neve. Bármilyen név használható, de konvenció szerint az áttelepítést leíró név van kiválasztva. Mivel ez az első migrálás, a létrehozott osztály az adatbázisséma létrehozásához szükséges kódot tartalmazza. Az adatbázisséma az osztályban MvcMovieContext megadott modellen alapul.

  • Update-Database: Frissíti az adatbázist a legújabb migrálásra, amelyet az előző parancs hozott létre. Ez a parancs futtatja a metódust Up a Migrations/{time-stamp}_InitialCreate.cs fájlban, amely létrehozza az adatbázist.

A Update-Database parancs a következő figyelmeztetést hozza létre:

Nem adott meg típust a "Movie" entitástípus "Ár" tizedesoszlopához. Ez az értékek csonkolásához vezet, ha nem illeszkednek az alapértelmezett pontossághoz és mértékhez. Explicit módon adja meg azt az SQL Server-oszloptípust, amely a "HasColumnType()" használatával minden értéket el tud fogadni.

Hagyja figyelmen kívül az előző figyelmeztetést, amely egy későbbi oktatóanyagban lesz javítva.

A PMC-eszközökkel kapcsolatos további információkért EF Corelásd EF Core az eszközökre vonatkozó referencia - PMC-t a Visual Studióban.

Az alkalmazás tesztelése

Futtassa az alkalmazást, és válassza a Filmalkalmazás hivatkozást.

Ha a következőhöz hasonló kivételt kap, előfordulhat, hogy elmulasztotta a migrálási lépést:

SqlException: Cannot open database "MvcMovieContext-1" requested by the login. The login failed.

Note

Előfordulhat, hogy nem tud tizedesvesszőt beírni a Price mezőbe. Az olyan nem angol nyelvű területi beállítások jQuery-érvényesítésének támogatásához, amelyek vesszőt (",") használnak tizedesvesszőhöz és nem US-English dátumformátumokhoz, az alkalmazást globalizálni kell. A globalizációval kapcsolatos utasításokért tekintse meg a ésGitHub-problémát.

A létrehozott adatbázis környezeti osztályának és regisztrációjának vizsgálata

Ezzel EF Coreaz adathozzáférést egy modell használatával hajtja végre. A modell entitásosztályokból és környezeti objektumból áll, amelyek az adatbázissal való munkamenetet jelölik. A környezeti objektum lehetővé teszi az adatok lekérdezését és mentését. Az adatbázis-környezet a Microsoft.EntityFrameworkCore.DbContext fájlból származik, és megadja az adatmodellbe felvenni kívánt entitásokat.

Az állványzat létrehozza az Data/MvcMovieContext.cs adatbázis környezeti osztályát:

using Microsoft.EntityFrameworkCore;
using MvcMovie.Models;

namespace MvcMovie.Data
{
    public class MvcMovieContext : DbContext
    {
        public MvcMovieContext (DbContextOptions<MvcMovieContext> options)
            : base(options)
        {
        }

        public DbSet<Movie> Movie { get; set; }
    }
}

Az előző kód létrehoz egy DbSet Movie< tulajdonságot>, amely az adatbázisban lévő filmeket jelöli.

ASP.NET Core függőséginjektálással (DI) épül fel. Az olyan szolgáltatásokat, mint az adatbázis-környezet, a DI-ben Startupkell regisztrálni. Az ezeket a szolgáltatásokat igénylő összetevők konstruktorparamétereken keresztül érhetők el.

A fájlban a Controllers/MoviesController.cs konstruktor függőséginjektálással injektálja az MvcMovieContext adatbázis-környezetet a vezérlőbe. Az adatbázis-környezet a vezérlőben található CRUD-metódusok mindegyikében használatos.

Az előzetes kódgenerálás a következő kiemelt kódot generálta a(z) Startup.ConfigureServices alatt.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext")));
}

A ASP.NET Core konfigurációs rendszer beolvassa az "MvcMovieContext" adatbázis kapcsolati sztringet.

A létrehozott adatbázis kapcsolati sztringjének vizsgálata

Az állványzat hozzáadott egy kapcsolati karakterláncot a appsettings.json fájlhoz.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-1;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

A helyi fejlesztéshez a ASP.NET Core konfigurációs rendszer beolvassa a ConnectionString kulcsot a appsettings.json fájlból.

Az InitialCreate osztály

Vizsgálja meg a migrálási Migrations/{timestamp}_InitialCreate.cs fájlt:

public partial class InitialCreate : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Movie",
            columns: table => new
            {
                Id = table.Column<int>(type: "int", nullable: false)
                    .Annotation("SqlServer:Identity", "1, 1"),
                Title = table.Column<string>(type: "nvarchar(max)", nullable: true),
                ReleaseDate = table.Column<DateTime>(type: "datetime2", nullable: false),
                Genre = table.Column<string>(type: "nvarchar(max)", nullable: true),
                Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Movie", x => x.Id);
            });
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "Movie");
    }
}

Az előző kódban:

  • InitialCreate.Up létrehozza a Movie táblát Id , és elsődleges kulcsként konfigurálja.
  • InitialCreate.Down Visszaállítja a migrálás által végrehajtott sémamódosításokat Up .

Függőséginjektálás a vezérlőben

Nyissa meg a Controllers/MoviesController.cs fájlt, és vizsgálja meg a konstruktort:

public class MoviesController : Controller
{
    private readonly MvcMovieContext _context;

    public MoviesController(MvcMovieContext context)
    {
        _context = context;
    }

A konstruktor függőséginjektálással injektálja az adatbázis-környezetet (MvcMovieContext) a vezérlőbe. Az adatbázis-környezet a vezérlőben található CRUD-metódusok mindegyikében használatos.

Tesztelje a Létrehozás lapot. Adja meg és küldje el az adatokat.

Tesztelje a Szerkesztés, a Részletek és a Törlés lapot.

Erősen típusozott modellek és az @model irányelv

Az oktatóanyag korábbi részében láthatta, hogyan adhat át egy vezérlő adatokat vagy objektumokat egy nézetnek a ViewData szótár használatával. A ViewData szótár egy dinamikus objektum, amely kényelmes, késői kötésű módot biztosít az információk nézetbe való továbbítására.

Az MVC lehetővé teszi, hogy szorosan típusos modell objektumokat adjon át egy nézetnek. Ez a szigorúan típusos megközelítés lehetővé teszi a fordítási időben történő kód ellenőrzést. Az sablon mechanizmus egy erősen típusos modellt továbbított a MoviesController osztályban és nézetekben.

Vizsgálja meg a fájlban létrehozott Details metódust Controllers/MoviesController.cs :

// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    var movie = await _context.Movie
        .FirstOrDefaultAsync(m => m.Id == id);
    if (movie == null)
    {
        return NotFound();
    }

    return View(movie);
}

A id paramétert általában útvonaladatokként adjuk át. Például https://localhost:5001/movies/details/1 készletek:

  • A movies vezérlő első URL-szegmense a vezérlő számára.
  • A második URL-szegmensre irányuló detailsművelet.
  • A id 1-re van beállítva, az utolsó URL-szegmens.

A id lekérdezési sztringgel is átadható, ahogyan az alábbi példában is látható:

https://localhost:5001/movies/details?id=1

A id paraméter null értékű típusként (int?) van definiálva abban az esetben, ha az id érték nincs megadva.

Egy lambda kifejezést adnak át a FirstOrDefaultAsync metódusnak, hogy kiválassza azokat a mozgókép-entitásokat, amelyek megfelelnek az útvonali adatoknak vagy a lekérdezési karakterlánc értéknek.

var movie = await _context.Movie
    .FirstOrDefaultAsync(m => m.Id == id);

Ha egy filmet találunk, a Movie modell egy példányát átadjuk a Details nézetnek.

return View(movie);

Vizsgálja meg a Views/Movies/Details.cshtml fájl tartalmát:

@model MvcMovie.Models.Movie

@{
    ViewData["Title"] = "Details";
}

<h1>Details</h1>

<div>
    <h4>Movie</h4>
    <hr />
    <dl class="row">
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Title)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Title)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.ReleaseDate)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.ReleaseDate)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Genre)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Genre)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Price)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Price)
        </dd>
    </dl>
</div>
<div>
    <a asp-action="Edit" asp-route-id="@Model.Id">Edit</a> |
    <a asp-action="Index">Back to List</a>
</div>

A @model nézetfájl tetején található utasítás határozza meg a nézet által várt objektum típusát. A filmvezérlő létrehozásakor a következő @model utasítás lett belefoglalva:

@model MvcMovie.Models.Movie

Ez az @model irányelv hozzáférést biztosít ahhoz a filmhez, amelyet a vezérlő átadott a nézetnek. Az Model objektum erősen be van gépelve. Például a Details.cshtml nézetben a kód átadja az egyes film mezőket az DisplayNameFor és DisplayFor HTML Segítőknek az erősen típusos Model objektummal. A Create metódusok és Edit nézetek egy modellobjektumot Movie is átadnak.

Vizsgálja meg a Index.cshtml nézetet és a metódust Index a Filmek vezérlőben. Figyelje meg, hogy a kód hogyan hoz létre objektumot List , amikor meghívja a metódust View . A kód a műveletmetódusból a Movies nézetbe továbbítja a Index listát:

// GET: Movies
public async Task<IActionResult> Index()
{
    return View(await _context.Movie.ToListAsync());
}

A filmek vezérlőjének létrehozásakor a sablon a következő @model utasítást tartalmazta a Index.cshtml fájl tetején:

@model IEnumerable<MvcMovie.Models.Movie>

Az @model irányelv lehetővé teszi a filmek listájához való hozzáférést, amelyet a vezérlő egy erősen típusos Model objektummal adott át a nézetnek. A nézetben például a Index.cshtml kód egy utasítással foreach végighalad a filmeken az erősen gépelt Model objektumon:

@model IEnumerable<MvcMovie.Models.Movie>

@{
    ViewData["Title"] = "Index";
}

<h1>Index</h1>

<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ReleaseDate)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Genre)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Price)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Title)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ReleaseDate)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Genre)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Price)
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
                <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
            </td>
        </tr>
}
    </tbody>
</table>

Mivel az Model objektum erősen típusos IEnumerable<Movie> objektumként van típusosítva, a ciklus minden eleme Movie típusú. A fordító többek között ellenőrzi a kódban használt típusokat.

Az SQL-naplózás az Entity Framework Core-ban

A naplózási konfigurációt általában a Logging fájlok appsettings.{Environment}.json szakasza biztosítja. SQL-utasítások naplózásához adja hozzá "Microsoft.EntityFrameworkCore.Database.Command": "Information" a appsettings.Development.json fájlhoz:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDB-2;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
     ,"Microsoft.EntityFrameworkCore.Database.Command": "Information"
    }
  },
  "AllowedHosts": "*"
}

Az előző JSON esetén az SQL-utasítások megjelennek a parancssorban és a Visual Studio kimeneti ablakában.

További információ: Naplózás a .NET-ben és ASP.NET Core-ban , valamint ez a GitHub-probléma.

További erőforrások

Ebben az oktatóanyagban osztályokat adunk hozzá az adatbázisokban lévő filmek kezeléséhez. Ezek az osztályok az MVC alkalmazás "Model" része.

Ezek a modellosztályok az Entity Framework Core (EF Core) használatával működnek együtt egy adatbázissal. EF Core Egy objektum-relációs leképezési (ORM) keretrendszer, amely leegyszerűsíti az írandó adatelérési kódot.

A létrehozott modellosztályokat POCO-osztályoknak nevezzük a Plain Old CLR Objectsből. A POCO-osztályok nem függenek a EF Core. Csak az adatbázisban tárolandó adatok tulajdonságait határozzák meg.

Ebben az oktatóanyagban a modellosztályok jönnek létre először, és EF Core létrehozza az adatbázist.

Adatmodell-osztály hozzáadása

Kattintson a jobb gombbal a Models mappára >Hozzáadás>Osztály. A fájl neve legyen Movie.cs.

Frissítse a Movie.cs fájlt a következő kóddal:

using System;
using System.ComponentModel.DataAnnotations;

namespace MvcMovie.Models
{
    public class Movie
    {
        public int Id { get; set; }
        public string Title { get; set; }

        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
        public decimal Price { get; set; }
    }
}

Az Movie osztály tartalmaz egy Id mezőt, amelyet az adatbázis az elsődleges kulcshoz szükséges.

A DataType rajta lévő ReleaseDate attribútum megadja az adatok típusát (Date). Ezzel az attribútummal:

  • A felhasználónak nem kell időadatokat megadnia a dátum mezőben.
  • Csak a dátum jelenik meg, az időadatok nem.

A DataAnnotations egy későbbi oktatóanyagban kerülnek tárgyalásra.

NuGet-csomagok hozzáadása

Az Eszközök menüben válassza a NuGet Package Manager Csomagkezelő>konzol (PMC) lehetőséget.

PMC menü

A PMC-ben futtassa a következő parancsot:

Install-Package Microsoft.EntityFrameworkCore.SqlServer

Az előző parancs hozzáadja az EF Core SQL Server-szolgáltatót. A szolgáltatói csomag függőségként telepíti a EF Core csomagot. A további csomagok automatikusan települnek az oktatóanyag későbbi keretrendszer lépésében.

Adatbázis környezeti osztályának létrehozása

A modell funkcióinak (létrehozás, olvasás, frissítés, törlés) összehangolásához EF Core adatbázis-környezeti osztályra Movie van szükség. Az adatbázis-környezet származik Microsoft.EntityFrameworkCore.DbContext , és meghatározza az adatmodellbe felvenni kívánt entitásokat.

Hozzon létre egy Adatmappát.

Adjon hozzá egy Data/MvcMovieContext.cs fájlt a következő kóddal:

using Microsoft.EntityFrameworkCore;
using MvcMovie.Models;

namespace MvcMovie.Data
{
    public class MvcMovieContext : DbContext
    {
        public MvcMovieContext (DbContextOptions<MvcMovieContext> options)
            : base(options)
        {
        }

        public DbSet<Movie> Movie { get; set; }
    }
}

Az előző kód létrehoz egy DbSet<Movie> tulajdonságot az entitáskészlethez. Az Entity Framework terminológiájában az entitáskészletek általában egy adatbázistáblának felelnek meg. Egy entitás egy táblázati sorának felel meg.

Az adatbázis-környezet regisztrálása

ASP.NET Core függőséginjektálással (DI) épül fel. A szolgáltatásokat (például a DB-környezetet) regisztrálni kell a EF Core DI-ben az alkalmazás indításakor. Az ilyen szolgáltatásokat igénylő összetevők (például Razor Oldalak) konstruktorparamétereken keresztül érhetők el. A DB-környezetpéldányt lekérő konstruktorkód az oktatóanyag későbbi részében jelenik meg. Ebben a szakaszban regisztrálja az adatbázis-környezetet a DI-tárolóban.

Adja hozzá a következő using utasításokat a Startup.cstetején:

using MvcMovie.Data;
using Microsoft.EntityFrameworkCore;

Adja hozzá a következő kiemelt kódot a következőben Startup.ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext")));
}

A kapcsolati sztring nevét a rendszer egy metódus meghívásával továbbítja a környezetnek egy DbContextOptions objektumon. A helyi fejlesztéshez a ASP.NET Core konfigurációs rendszer beolvassa a kapcsolati sztringet a appsettings.json fájlból.

Az adatbázis kapcsolati sztringjének vizsgálata

Kapcsolati string hozzáadása a appsettings.json fájlhoz:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-1;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Állítsa össze a projektet fordítóhibák ellenőrzéseként.

Filmoldalak előkészítése

Használja a generáló eszközt a filmmodellhez tartozó Create, Read, Update, és Delete (CRUD) oldalak létrehozásához.

A Megoldáskezelőben kattintson a jobb gombbal a Vezérlők mappára, majd válassza az > Új Sablon-alapú Elem Hozzáadása> lehetőséget.

a fenti lépés nézete

Az Állványzat hozzáadása párbeszédpanelen válassza a nézetekkel rendelkező MVC-vezérlőt az Entity Framework > Add paranccsal.

Állványzat hozzáadása párbeszédpanel

Fejezze be a Vezérlő hozzáadása párbeszédpanelt:

  • Modellosztály:Movie (MvcMovie.Models)
  • Adatkörnyezeti osztály:MvcMovieContext (MvcMovie.Data)

Adatkörnyezet hozzáadása

  • Nézetek: Az egyes opciók alapértelmezett beállításainak megtartása
  • Vezérlő neve: Az alapértelmezett MoviesController megtartása
  • Válassza ki a -t, adja hozzá a-et

A Visual Studio a következőket hozza létre:

  • Filmvezérlő (Controllers/MoviesController.cs)
  • Razor fájlok megtekintése létrehozási, törlési, részleteki, szerkesztési és indexelési lapokhoz (*Nézetek/Filmek/'.cshtml')

Ezeknek a fájloknak az automatikus létrehozását állványzatnak nevezzük.

Az állványozott lapokat még nem használhatja, mert az adatbázis nem létezik. Ha futtatja az alkalmazást, és a Mozgóképalkalmazás hivatkozásra kattint, egy Nem nyitható meg adatbázis vagy nincs ilyen tábla: Film hibaüzenet jelenik meg.

Kezdeti migrálás

Az adatbázis létrehozásához használja a EF CoreMigrálás funkciót . A migrálás olyan eszközök készlete, amelyekkel adatbázist hozhat létre és frissíthet az adatmodellnek megfelelően.

Az Eszközök menüben válassza a NuGet Package Manager Csomagkezelő>konzol (PMC) lehetőséget.

A PMC-ben adja meg a következő parancsokat:

Add-Migration InitialCreate
Update-Database
  • Add-Migration InitialCreate: Migrálási Migrations/{timestamp}_InitialCreate.cs fájlt hoz létre. A InitialCreate argumentum a migráció neve. Bármilyen név használható, de konvenció szerint az áttelepítést leíró név van kiválasztva. Mivel ez az első migrálás, a létrehozott osztály az adatbázisséma létrehozásához szükséges kódot tartalmazza. Az adatbázisséma az osztályban MvcMovieContext megadott modellen alapul.

  • Update-Database: Frissíti az adatbázist a legújabb migrálásra, amelyet az előző parancs hozott létre. Ez a parancs futtatja a metódust Up a Migrations/{time-stamp}_InitialCreate.cs fájlban, amely létrehozza az adatbázist.

    Az adatbázis-frissítési parancs a következő figyelmeztetést generálja:

    Nem adott meg típust a "Movie" entitástípus "Ár" tizedesoszlopához. Ez az értékek csonkolásához vezet, ha nem illeszkednek az alapértelmezett pontossághoz és mértékhez. Explicit módon adja meg azt az SQL Server-oszloptípust, amely a "HasColumnType()" használatával minden értéket el tud fogadni.

    Ezt a figyelmeztetést figyelmen kívül hagyhatja, az egy későbbi oktatóanyagban lesz javítva.

A PMC-eszközökkel kapcsolatos további információkért EF Corelásd EF Core az eszközökre vonatkozó referencia - PMC-t a Visual Studióban.

Az InitialCreate osztály

Vizsgálja meg a migrálási Migrations/{timestamp}_InitialCreate.cs fájlt:

public partial class InitialCreate : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Movie",
            columns: table => new
            {
                Id = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:ValueGenerationStrategy", 
                                 SqlServerValueGenerationStrategy.IdentityColumn),
                Title = table.Column<string>(nullable: true),
                ReleaseDate = table.Column<DateTime>(nullable: false),
                Genre = table.Column<string>(nullable: true),
                Price = table.Column<decimal>(nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Movie", x => x.Id);
            });
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "Movie");
    }
}

A Up metódus létrehozza a Movie táblát, és Id-t elsődleges kulcsként konfigurálja. A Down metódus visszaállítja a Up áttelepítés által végrehajtott sémamódosításokat.

Az alkalmazás tesztelése

  • Futtassa az alkalmazást, és kattintson a Filmalkalmazás hivatkozásra.

    Ha az alábbiakhoz hasonló kivételt tapasztal:

SqlException: Cannot open database "MvcMovieContext-1" requested by the login. The login failed.

Valószínűleg kihagyta a migrálási lépést.

  • Tesztelje a Létrehozás lapot. Adja meg és küldje el az adatokat.

    Note

    Előfordulhat, hogy nem tud tizedesvesszőt beírni a Price mezőbe. Az olyan nem angol nyelvű területi beállítások jQuery-érvényesítésének támogatásához, amelyek vesszőt (",") használnak tizedesvesszőhöz és nem US-English dátumformátumokhoz, az alkalmazást globalizálni kell. A globalizációval kapcsolatos utasításokért tekintse meg a ésGitHub-problémát.

  • Tesztelje a Szerkesztés, a Részletek és a Törlés lapot.

Függőséginjektálás a vezérlőben

Nyissa meg a Controllers/MoviesController.cs fájlt, és vizsgálja meg a konstruktort:

public class MoviesController : Controller
{
    private readonly MvcMovieContext _context;

    public MoviesController(MvcMovieContext context)
    {
        _context = context;
    }

A konstruktor függőséginjektálással injektálja az adatbázis-környezetet (MvcMovieContext) a vezérlőbe. Az adatbázis-környezet a vezérlőben található CRUD-metódusok mindegyikében használatos.

Erősen gépelt modellek és a @model kulcsszó

Az oktatóanyag korábbi részében láthatta, hogyan adhat át egy vezérlő adatokat vagy objektumokat egy nézetnek a ViewData szótár használatával. A ViewData szótár egy dinamikus objektum, amely kényelmes, késői kötésű módot biztosít az információk nézetbe való továbbítására.

Az MVC lehetővé teszi az erősen gépelt modellobjektumok nézetbe való továbbítását is. Ez a szigorúan típusos megközelítés lehetővé teszi a fordítási időben történő kód ellenőrzést. Az állványzati mechanizmus ezt a megközelítést használta (vagyis egy erősen gépelt modellt adott át) a MoviesController osztállyal és a nézetekkel.

Vizsgálja meg a fájlban létrehozott Details metódust Controllers/MoviesController.cs :

// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    var movie = await _context.Movie
        .FirstOrDefaultAsync(m => m.Id == id);
    if (movie == null)
    {
        return NotFound();
    }

    return View(movie);
}

A id paramétert általában útvonaladatokként adjuk át. Például https://localhost:5001/movies/details/1 beállítja:

  • A movies vezérlőre mutató vezérlő (az első URL-szegmens).
  • A következő details művelet (a második URL-szegmens).
  • Az azonosítót állítsd 1-re (az utolsó URL-szegmensre).

Az id-t a következőképpen is megadhatja egy lekérdezési sztringgel:

https://localhost:5001/movies/details?id=1

A id paraméter null értékű típusként (int?) van definiálva, ha nincs megadva azonosítóérték.

Egy lambda-kifejezést adunk át FirstOrDefaultAsync-nak, hogy kiválassza azokat a film entitásokat, amelyek megfelelnek az útvonaladati vagy a lekérdezési sztringértékeknek.

var movie = await _context.Movie
    .FirstOrDefaultAsync(m => m.Id == id);

Ha egy filmet találunk, a Movie modell egy példányát átadjuk a Details nézetnek.

return View(movie);

Vizsgálja meg a Views/Movies/Details.cshtml fájl tartalmát:

@model MvcMovie.Models.Movie

@{
    ViewData["Title"] = "Details";
}

<h1>Details</h1>

<div>
    <h4>Movie</h4>
    <hr />
    <dl class="row">
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Title)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Title)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.ReleaseDate)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.ReleaseDate)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Genre)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Genre)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Price)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Price)
        </dd>
    </dl>
</div>
<div>
    <a asp-action="Edit" asp-route-id="@Model.Id">Edit</a> |
    <a asp-action="Index">Back to List</a>
</div>

A @model nézetfájl tetején található utasítás határozza meg a nézet által várt objektum típusát. A filmvezérlő létrehozásakor a következő @model utasítás lett belefoglalva:

@model MvcMovie.Models.Movie

Ez az @model irányelv hozzáférést biztosít ahhoz a filmhez, amelyet a vezérlő átadott a nézetnek. Az Model objektum erősen be van gépelve. Például a Details.cshtml nézetben a kód átadja az egyes film mezőket az DisplayNameFor és DisplayFor HTML Segítőknek az erősen típusos Model objektummal. A Create metódusok és Edit nézetek egy modellobjektumot Movie is átadnak.

Vizsgálja meg a Index.cshtml nézetet és a metódust Index a Filmek vezérlőben. Figyelje meg, hogy a kód hogyan hoz létre objektumot List , amikor meghívja a metódust View . A kód a műveletmetódusból a Movies nézetbe továbbítja a Index listát:

// GET: Movies
public async Task<IActionResult> Index()
{
    return View(await _context.Movie.ToListAsync());
}

A filmek vezérlőjének létrehozásakor a sablon a következő @model utasítást tartalmazta a Index.cshtml fájl tetején:

@model IEnumerable<MvcMovie.Models.Movie>

Az @model irányelv lehetővé teszi a filmek listájának elérését, amelyet a vezérlő a nézetnek egy erősen gépelt objektummal Model adott át. A nézetben például a Index.cshtml kód egy utasítással foreach végighalad a filmeken az erősen gépelt Model objektumon:

@model IEnumerable<MvcMovie.Models.Movie>

@{
    ViewData["Title"] = "Index";
}

<h1>Index</h1>

<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ReleaseDate)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Genre)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Price)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Title)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ReleaseDate)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Genre)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Price)
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
                <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
            </td>
        </tr>
}
    </tbody>
</table>

Mivel az Model objektum erősen típusos (mint IEnumerable<Movie> objektum), a ciklus minden eleme Movie típusosítva van. Ez többek között azt jelenti, hogy a kód fordítási ideje alatt ellenőrzéseket kap.

További erőforrások