Bölüm 4, bir MVC uygulamasına ASP.NET Core ekleme

Rick Anderson ve Jon P Smith tarafından.

Bu bölümde, bir veritabanında film yönetimi için sınıflar eklenmiştir. Bu sınıflar, M VC uygulamasının "M odel" bölümü.

Bu model sınıfları, Entity Framework Core (EF Core) ile birlikte kullanılır. EF Core, yazmanız gereken veri erişim kodunu basitleştiren bir nesne ilişkisel eşleme (ORM) çerçevesidir.

Oluşturulan model sınıfları , _*P**lain O ld C LR O projelerinden *POCO _ sınıfları olarak bilinir. POCO sınıflarında bu sınıflara bağımlılık EF Core. Bunlar yalnızca veritabanında depolanmış verilerin özelliklerini tanımlar.

Bu öğreticide önce model sınıfları oluşturulur ve EF Core oluşturulur.

Veri modeli sınıfı ekleme

Sınıf Ekle'yi seçin ve Models > sağ > tıklayın. Dosyaya Movie.cs adını girin.

Models/Movie.cs dosyasını aşağıdaki kodla güncelleştirin:

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

Moviesınıfı, birincil Id anahtar için veritabanı tarafından gerekli olan bir alan içerir.

DataTypeözniteliği, ReleaseDate verilerin türünü () Date belirtir. Bu öznitelikle:

  • Kullanıcının tarih alanına saat bilgilerini girmesi gerekmez.
  • Saat bilgileri değil yalnızca tarih görüntülenir.

DataAnnotations sonraki bir öğreticide ele atılır.

NuGet paketlerini ekleme

Araçlar menüsünden NuGet Paket Yöneticisi > Paket Yöneticisi (PMC) öğesini seçin.

PMC menüsü

PMC'de aşağıdaki komutu çalıştırın:

Install-Package Microsoft.EntityFrameworkCore.Design

Yukarıdaki komutlar şunları ekler:

  • EF Core SQL Server sağlayıcısı. Sağlayıcı paketi, EF Core paketi bağımlılık olarak yüklenir.
  • Öğreticinin sonraki adımlarında, iskele adımına otomatik olarak yüklenmiş paketler tarafından kullanılan yardımcı programlar.

Projeyi derleyici hatalarını denetleme olarak derle.

Film sayfalarının iskelesi

Film modeli için , , ve Create Read Update (CRUD) sayfaları üretmek için Delete yapı iskelesi aracını kullanın.

Bu Çözüm Gezgini, Denetleyiciler klasörüne sağ tıklayın ve Yeni İskele > Ekle'yi seçin.

yukarıdaki adımın görünümü

İskele Ekle iletişim kutusunda Ekle'yi kullanarak görünümlere sahip MVC Denetleyicisi'Entity Framework > seçin.

İskele Ekle iletişim kutusu

MVC Denetleyicisi ekle iletişim kutusunu kullanarak görünümlerle Entity Framework:

  • Model sınıfı açılan listesinde Film (MvcMovie.Models) öğesini seçin.
  • Veri bağlamı sınıfı satırına + (artı) işareti seçin.
    • Veri Bağlamı Ekle iletişim kutusunda, MvcMovie.Data.MvcMovieContext sınıf adı oluşturulur.
    • Add (Ekle) seçeneğini belirleyin.
  • Görünümler ve Denetleyici adı: Varsayılan değeri kullanın.
  • Add (Ekle) seçeneğini belirleyin.

Veri Ekle bağlamı varsayılanları tutma

Yapı iskelesi aşağıdaki güncelleştirmeleri içerir:

  • MvcMovie.csproj proje dosyasına gerekli paket başvurularını ekler.
  • Startup.cs dosyasının Startup.ConfigureServices veritabanı bağlamını kaydeden.
  • Dosyaya bir veritabanı bağlantı dizesi appsettings.json ekler.

Yapı iskelesi şunları oluşturur:

  • Film denetleyicisi: Controllers/MoviesController.cs
  • Razor Oluşturma, Silme, Ayrıntılar, Düzenleme ve Dizin sayfaları için dosyaları görüntüleme: Views/Movies/*.cshtml
  • Veritabanı bağlam sınıfı: Data/MvcMovieContext.cs

Bu dosyaların ve dosya güncelleştirmelerinin otomatik olarak oluşturulması yapı iskelesi olarak bilinir.

veritabanı mevcut olduğundan iskelesi olan sayfalar henüz kullanılamaz. Uygulamayı çalıştırma ve Film Uygulaması bağlantısının seçerek veritabanı açamaz veya böyle bir tablo olmaz: Film hata iletisi.

İlk geçiş

Veritabanını EF Core Geçişler özelliğini kullanın. Geçişler, veritabanı oluşturma ve veri modeliyle eşleşmesi için güncelleştirme işlemi yapmak için bir dizi araçtır.

Araçlar menüsünden Konsol'NuGet Paket Yöneticisi > Paket Yöneticisi seçin.

Paket Yöneticisi Konsolu'na (PMC) aşağıdaki komutları girin:

Add-Migration InitialCreate
Update-Database

  • Add-Migration InitialCreate: Migrations/{timestamp}_InitialCreate.cs geçiş dosyası üretir. bağımsız InitialCreate değişkeni, geçiş adıdır. Herhangi bir ad kullanılabilir, ancak kurala göre geçişi açıklayan bir ad seçilir. Bu ilk geçiş olduğundan, oluşturulan sınıf veritabanı şemasını oluşturmak için kod içerir. Veritabanı şeması, sınıfında belirtilen modeli temel MvcMovieContext alır.

  • Update-Database: Veritabanını, önceki komutun oluşturduğu en son geçişe kadar günceller. Bu komut, Up veritabanını oluşturan Migrations/{time-stamp}_InitialCreate.cs dosyasında yöntemini çalıştırır.

Komutu Update-Database aşağıdaki uyarıyı üretir:

'Film' varlık türü üzerinde 'Price' ondalık sütunu için tür belirtilmedi. Bu, varsayılan duyarlık ve ölçeklendirmeye sığmayan değerlerin sessizce kesilmesine neden olur. 'HasColumnType()SQL kullanarak tüm değerleri barındıran sunucu sütun türünü açıkça belirtin.

Önceki uyarıyı yoksayın, sonraki bir öğreticide düzeltilmiştir.

EF Core için PMC araçları hakkında daha fazla bilgi için bkz. Visual Studio 'da EF Core araçları başvurusu-PMC.

Uygulamayı test etme

Uygulamayı çalıştırın ve Film Uygulaması bağlantısını seçin.

Aşağıdakine benzer bir özel durum alıyorsanız, geçişler adımını atlemiş olabilirsiniz:

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

Not

Alana ondalık virgül gireyemebilirsiniz. Price Ondalık ayırıcı için virgül (",") kullanan İngilizce olmayan yerel değerler için jQuery doğrulamasını desteklemek ve tarih biçimlerini US-English için uygulamanın genelleştirilmiş olması gerekir. Genelleştirme yönergeleri için bu GitHub bakın.

Oluşturulan veritabanı bağlam sınıfını ve kaydını inceleme

Veri EF Core, veri erişimi bir model kullanılarak gerçekleştirilir. Model, varlık sınıflarının ve veritabanıyla bir oturumu temsil eden bir bağlam nesnesidir. Bağlam nesnesi, verileri sorgulamaya ve kaydetmeye olanak sağlar. Veritabanı bağlamı Microsoft.EntityFrameworkCore.DbContext'den türetilen ve veri modeline dahil edilen varlıkları belirtir.

Yapı iskelesi Data/MvcMovieContext.cs veritabanı bağlam sınıfını oluşturur:

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

Yukarıdaki kod, veritabanındaki <Movie> filmleri temsil eden bir DbSet özelliği oluşturur.

ASP.NET Core , bağımlılık ekleme (DI) ile birlikte yerleşiktir. Veritabanı bağlamı gibi hizmetlerin içinde DI'ye kayıtlı olması Startup gerekir. Bu hizmetleri gerektiren bileşenler oluşturucu parametreleri aracılığıyla sağlanır.

Controllers/MoviesController.cs dosyasında oluşturucu, veritabanı bağlamını denetleyiciye eklemesi için MvcMovieContext Bağımlılık Ekleme'yi kullanır. Veritabanı bağlamı, denetleyicide CRUD yöntemlerinin her biri için kullanılır.

yapı iskelesi içinde aşağıdaki vurgulanmış kodu Startup.ConfigureServices oluştur:

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

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

Yapılandırma ASP.NET Core " MvcMovieContext" veritabanı bağlantı dizesini okur.

Oluşturulan veritabanı bağlantı dizesini inceleme

yapı iskelesi dosyaya bir bağlantı dizesi appsettings.json ekledi:

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

Yerel geliştirme için ASP.NET Core sistemi anahtarı ConnectionString dosyadan appsettings.json okur.

InitialCreatesınıfı

Migrations/{timestamp}_InitialCreate.cs geçiş dosyasını inceleme:

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

Yukarıdaki kodda:

  • InitialCreate.Up , Film tablosu oluşturur ve birincil Id anahtar olarak yapılandırılır.
  • InitialCreate.Down geçiş tarafından yapılan şema değişikliklerini Up geri döner.

Denetleyiciye bağımlılık ekleme

Controllers/MoviesController.cs dosyasını açın ve oluşturucusu inceleme:

public class MoviesController : Controller
{
    private readonly MvcMovieContext _context;

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

Oluşturucu, veritabanı bağlamını ( ) denetleyiciye eklemek MvcMovieContext için Bağımlılık Ekleme kullanır. Veritabanı bağlamı, denetleyicide CRUD yöntemlerinin her biri için kullanılır.

Oluştur sayfasını test edin. Verileri girin ve gönderin.

Düzenle, Ayrıntılar ve Sil sayfalarını test edin.

Kesin türe sahip modeller ve @model yönergesi

Bu öğreticinin önceki sürümlerinde denetleyicinin sözlüğü kullanarak bir görünüme nasıl veri veya nesne geçe olduğunu ViewData görmüştük. Sözlüğü, ViewData bilgileri bir görünüme iletirken kullanışlı ve geç bağlı bir yol sağlayan dinamik bir nesnedir.

MVC, kesin türe sahip model nesnelerini bir görünüme geçebilme olanağı sağlar. Türü kesin olarak belirtilen bu yaklaşım derleme zamanı kod denetimine olanak sağlar. Yapı iskelesi mekanizması, sınıf ve görünümlerde türü kesin olarak kesin olan MoviesController bir modelden geçti.

Details Controllers/MoviesController.cs dosyasında oluşturulan yöntemi inceleme:

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

parametresi id genellikle yol verileri olarak geçirildi. Örneğin, https://localhost:5001/movies/details/1 kümeler:

  • Denetleyicinin movies denetleyicisi, ilk URL segmenti.
  • eylemi, details ikinci URL segmenti.
  • son id URL segmenti olan 1'e.

id, aşağıdaki örnekte olduğu gibi bir sorgu dizesiyle geçirebilirsiniz:

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

parametresi, id değerin sağlanmamış olduğu durumlarda null int? değere değiştirilebilir bir tür ( ) olarak id tanımlanır.

Yol verileri veya sorgu dizesi değeriyle eşan film varlıklarını seçmek için yöntemine bir lambda FirstOrDefaultAsync ifadesi geçirildi.

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

Bir film bulunursa, modelin bir Movie örneği görünüme Details geçirildi:

return View(movie);

Views/Movies/Details.cshtml dosyasının içeriğini inceleme:

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

Görünüm @model dosyasının en üstünde yer alan deyimi, görünümün beklediğiniz nesne türünü belirtir. Film denetleyicisi oluşturulduğunda aşağıdaki deyim @model dahil edildi:

@model MvcMovie.Models.Movie

Bu @model yönerge, denetleyicinin görünüme geçir olduğu filme erişim sağlar. Nesne Model kesin olarak yazıldı. Örneğin Details.cshtml görünümünde kod, her bir film alanını kesin olarak türü kesin olarak belirtilen nesnesiyle ve DisplayNameFor DisplayFor HTML Yardımcıları'na Model iletir. ve Create yöntemleri ve görünümleri de bir model nesnesi Edit Movie iletir.

Movies denetleyicisinde Index.cshtml Index görünümünü ve yöntemini inceleme. Kodun yöntemini çağıran List bir nesneyi nasıl oluşturduğuna dikkat View eder. Kod, bu Movies listeyi eylem Index yönteminden görünümüne iletir:

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

Film denetleyicisi oluşturulduğunda, yapı iskelesi @model Index.cshtml dosyasının en üstüne aşağıdaki deyimi dahil etti:

@model IEnumerable<MvcMovie.Models.Movie>

yönergesi, denetleyicinin kesin olarak türü kesin olarak yazarak görünüme geçirilen @model Model filmlerin listesine erişim sağlar. Örneğin, Index. cshtml görünümünde, kod foreach kesin türü belirtilmiş nesne üzerinde bir deyimle birlikte filmlerde döngü yapılır Model :

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

ModelNesne kesin bir nesne olarak yazıldığından IEnumerable<Movie> , döngüdeki her öğe olarak yazılır Movie . Diğer avantajların yanı sıra, derleyici kodda kullanılan türleri doğrular.

SQL Entity Framework Core günlüğe kaydetme

Günlüğe kaydetme yapılandırması genellikle Logging appSettings'in bölümü tarafından sağlanır. {Environment} . JSON dosyaları. SQL deyimlerini günlüğe kaydetmek için, "Microsoft.EntityFrameworkCore.Database.Command": "Information" appsettings.Development.js dosyasına ekleyin:

{
  "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": "*"
}

önceki JSON ile, SQL deyimleri komut satırında ve Visual Studio çıkış penceresinde görüntülenir.

daha fazla bilgi için, bkz .NET Core ve ASP.NET Core'da günlük . ve bu GitHub sorunu.

Ek kaynaklar

Veri modeli sınıfı ekleme

Sınıf Ekle > modeller klasörüne sağ tıklayın > . Filmi. cs adlı dosyayı adlandırın.

Modeller/film. cs dosyasını aşağıdaki kodla güncelleştirin:

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

MovieSınıfı, Id birincil anahtar için veritabanı için gerekli olan bir alanı içerir.

DataTypeÜzerindeki özniteliği, ReleaseDate veri türünü belirtir ( Date ). Bu öznitelikle:

  • Kullanıcının Tarih alanına saat bilgilerini girmesi gerekli değildir.
  • Zaman bilgisi değil yalnızca tarih görüntülenir.

Veri açıklamaları sonraki bir öğreticide ele alınmıştır.

NuGet paketlerini ekleme

araçlar menüsünde, NuGet Paket Yöneticisi > Paket Yöneticisi konsolu (PMC) seçeneğini belirleyin.

PMC menüsü

PMC 'de şu komutu çalıştırın:

Install-Package Microsoft.EntityFrameworkCore.Design

Yukarıdaki komutlar şunları ekler:

  • EF Core SQL Server sağlayıcısı. Sağlayıcı paketi, EF Core paketini bir bağımlılık olarak yüklüyor.
  • Paketler tarafından kullanılan yardımcı programlar, öğreticinin sonraki bölümlerinde bulunan otomatik olarak yapı adım.

Projeyi derleyici hatalarına yönelik bir denetim olarak derleyin.

Yapı iskelesi film sayfaları

CreateFilm modelinin,,, Read Update ve Delete (CRUD) sayfalarını oluşturmak için scafkatlama aracını kullanın.

Çözüm Gezgini, denetleyiciler klasörüne sağ tıklayın ve > yeni yapı iskelesi öğesi Ekle' yi seçin.

Yukarıdaki adımın görünümü

Yapı Ekle iletişim kutusunda, Entity Framework > Ekle ' yi kullanarak views ile MVC denetleyicisi ' ni seçin.

Yapı Iskelesi Ekle iletişim kutusu

Entity Framework iletişim kutusu kullanarak, görünümler Ile MVC denetleyicisi ekleme ' yi doldurun:

  • Model sınıfı açılan kutusunda Film (mvcmovie. modeller) öğesini seçin.
  • Veri bağlamı sınıfı satırında, + (artı) işaretini seçin.
    • Veri bağlamı Ekle iletişim kutusunda, mvcmovie. Data. MvcMovieContext sınıf adı oluşturulur.
    • Add (Ekle) seçeneğini belirleyin.
  • Görünümler ve Denetleyici adı: varsayılanı tut.
  • Add (Ekle) seçeneğini belirleyin.

Veri bağlamı saklama varsayılanlarını Ekle

Yapı iskelesi aşağıdakileri güncelleştirir:

  • Mvcmovie. csproj proje dosyasına gerekli paket başvurularını ekler.
  • Database bağlamını Startup.ConfigureServices Startup. cs dosyasına kaydeder.
  • Dosyaya bir veritabanı bağlantı dizesi ekler appsettings.json .

Yapı iskelesi aşağıdakileri oluşturur:

  • Bir filmler denetleyicisi: denetleyiciler/MoviesController. cs
  • Razoroluşturma, silme, Ayrıntılar, düzenleme ve Dizin sayfaları için dosyaları görüntüle:Views/Movies/*.cshtml
  • Veritabanı bağlamı sınıfı: Data/MvcMovieContext. cs

Bu dosyaların ve dosya güncelleştirmelerinin otomatik olarak oluşturulması, Yapı iskelesi olarak bilinir.

Veritabanı mevcut olmadığından, yapı iskelesi sayfaları henüz kullanılamaz. Uygulamayı çalıştırma ve film uygulaması bağlantısını seçme sonuçları, bir veritabanı açılamıyor veya böyle bir tablo olamaz: film hata iletisi.

İlk geçiş

Veritabanını oluşturmak için EF Core geçişleri özelliğini kullanın. Geçişler, veritabanı oluşturma ve veri modeliyle eşleşmesi için güncelleştirme işlemi yapmak için bir dizi araçtır.

Araçlar menüsünden Konsol'NuGet Paket Yöneticisi > Paket Yöneticisi seçin.

Paket Yöneticisi Konsolu'na (PMC) aşağıdaki komutları girin:

Add-Migration InitialCreate
Update-Database

  • Add-Migration InitialCreate: Migrations/{timestamp}_InitialCreate.cs geçiş dosyası üretir. bağımsız InitialCreate değişkeni, geçiş adıdır. Herhangi bir ad kullanılabilir, ancak kurala göre geçişi açıklayan bir ad seçilir. Bu ilk geçiş olduğundan, oluşturulan sınıf veritabanı şemasını oluşturmak için kod içerir. Veritabanı şeması, sınıfında belirtilen modeli temel MvcMovieContext alır.

  • Update-Database: Veritabanını, önceki komutun oluşturduğu en son geçişe kadar günceller. Bu komut, Up veritabanını oluşturan Migrations/{time-stamp}_InitialCreate.cs dosyasında yöntemini çalıştırır.

Komutu Update-Database aşağıdaki uyarıyı üretir:

'Film' varlık türü üzerinde 'Price' ondalık sütunu için tür belirtilmedi. Bu, varsayılan duyarlık ve ölçeklendirmeye sığmayan değerlerin sessizce kesilmesine neden olur. 'HasColumnType()' SQL tüm değerleri barındıran sunucu sütun türünü açıkça belirtin.

Önceki uyarıyı yoksayın, sonraki bir öğreticide düzeltilmiştir.

EF Core için PMC araçları hakkında daha fazla bilgi için bkz. Visual Studio 'da EF Core araçları başvurusu-PMC.

Uygulamayı test etme

Uygulamayı çalıştırın ve Film Uygulaması bağlantısını seçin.

Aşağıdakine benzer bir özel durum alıyorsanız, geçişler adımını atlemiş olabilirsiniz:

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

Not

Alana ondalık virgül gireyemebilirsiniz. Price Ondalık ayırıcı için virgül (",") kullanan İngilizce olmayan yerel değerler için jQuery doğrulamasını desteklemek ve tarih biçimlerini US-English için uygulamanın genelleştirilmiş olması gerekir. Genelleştirme yönergeleri için bu GitHub bakın.

Oluşturulan veritabanı bağlam sınıfını ve kaydını inceleme

Veri EF Core, veri erişimi bir model kullanılarak gerçekleştirilir. Model, varlık sınıflarının ve veritabanıyla bir oturumu temsil eden bir bağlam nesnesidir. Bağlam nesnesi, verileri sorgulamaya ve kaydetmeye olanak sağlar. Veritabanı bağlamı Microsoft.EntityFrameworkCore.DbContext'den türetilen ve veri modeline dahil edilen varlıkları belirtir.

Yapı iskelesi Data/MvcMovieContext.cs veritabanı bağlam sınıfını oluşturur:

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

Yukarıdaki kod, veritabanındaki <Movie> filmleri temsil eden bir DbSet özelliği oluşturur.

ASP.NET Core, bağımlılık ekleme (DI) ile birlikte yerleşiktir. Veritabanı bağlamı gibi hizmetlerin içinde DI'ye kayıtlı olması Startup gerekir. Bu hizmetleri gerektiren bileşenler oluşturucu parametreleri aracılığıyla sağlanır.

Controllers/MoviesController.cs dosyasında oluşturucu, veritabanı bağlamını denetleyiciye eklemesi için MvcMovieContext Bağımlılık Ekleme'yi kullanır. Veritabanı bağlamı, denetleyicide CRUD yöntemlerinin her biri için kullanılır.

yapı iskelesi içinde aşağıdaki vurgulanmış kodu Startup.ConfigureServices oluştur:

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

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

Yapılandırma ASP.NET Core " MvcMovieContext" veritabanı bağlantı dizesini okur.

Oluşturulan veritabanı bağlantı dizesini inceleme

yapı iskelesi dosyaya bir bağlantı dizesi appsettings.json ekledi:

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

Yerel geliştirme için ASP.NET Core sistemi, anahtarı ConnectionString dosyadan appsettings.json okur.

InitialCreatesınıfı

Migrations/{timestamp}_InitialCreate.cs geçiş dosyasını inceleme:

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

Yukarıdaki kodda:

  • InitialCreate.Up , Film tablosu oluşturur ve birincil Id anahtar olarak yapılandırılır.
  • InitialCreate.Down geçiş tarafından yapılan şema değişikliklerini Up geri döner.

Denetleyiciye bağımlılık ekleme

Controllers/MoviesController.cs dosyasını açın ve oluşturucusu inceleme:

public class MoviesController : Controller
{
    private readonly MvcMovieContext _context;

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

Oluşturucu, veritabanı bağlamını ( ) denetleyiciye eklemek MvcMovieContext için Bağımlılık Ekleme kullanır. Veritabanı bağlamı, denetleyicide CRUD yöntemlerinin her biri için kullanılır.

Oluştur sayfasını test edin. Verileri girin ve gönderin.

Düzenle, Ayrıntılar ve Sil sayfalarını test edin.

Kesin türe sahip modeller ve @model yönergesi

Bu öğreticinin önceki sürümlerinde denetleyicinin sözlüğü kullanarak bir görünüme nasıl veri veya nesne geçe olduğunu ViewData görmüştük. Sözlüğü, ViewData bilgileri bir görünüme iletirken kullanışlı ve geç bağlı bir yol sağlayan dinamik bir nesnedir.

MVC, kesin türe sahip model nesnelerini bir görünüme geçebilme olanağı sağlar. Türü kesin olarak belirtilen bu yaklaşım derleme zamanı kod denetimine olanak sağlar. Yapı iskelesi mekanizması, sınıf ve görünümlerde türü kesin olarak kesin olan MoviesController bir modelden geçti.

Details Controllers/MoviesController.cs dosyasında oluşturulan yöntemi inceleme:

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

parametresi id genellikle yol verileri olarak geçirildi. Örneğin, https://localhost:5001/movies/details/1 kümeler:

  • Denetleyicinin movies denetleyicisi, ilk URL segmenti.
  • eylemi, details ikinci URL segmenti.
  • son id URL segmenti olan 1'e.

id, aşağıdaki örnekte olduğu gibi bir sorgu dizesiyle geçirebilirsiniz:

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

parametresi, id değerin sağlanmamış olduğu durumlarda null int? değere değiştirilebilir bir tür ( ) olarak id tanımlanır.

Yol verileri veya sorgu dizesi değeriyle eşan film varlıklarını seçmek için yöntemine bir lambda FirstOrDefaultAsync ifadesi geçirildi.

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

Bir film bulunursa, modelin bir Movie örneği görünüme Details geçirildi:

return View(movie);

Views/Movies/Details.cshtml dosyasının içeriğini inceleme:

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

Görünüm @model dosyasının en üstünde yer alan deyimi, görünümün beklediğiniz nesne türünü belirtir. Film denetleyicisi oluşturulduğunda aşağıdaki deyim @model dahil edildi:

@model MvcMovie.Models.Movie

Bu @model yönerge, denetleyicinin görünüme geçir olduğu filme erişim sağlar. Nesne Model kesin olarak yazıldı. Örneğin Details.cshtml görünümünde kod, her bir film alanını kesin olarak türü kesin olarak belirtilen nesnesiyle ve DisplayNameFor DisplayFor HTML Yardımcıları'na Model iletir. ve Create yöntemleri ve görünümleri de bir model nesnesi Edit Movie iletir.

Movies denetleyicisinde Index.cshtml Index görünümünü ve yöntemini inceleme. Kodun yöntemini çağıran List bir nesneyi nasıl oluşturduğuna dikkat View eder. Kod, bu Movies listeyi eylem Index yönteminden görünümüne iletir:

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

Film denetleyicisi oluşturulduğunda, yapı iskelesi @model Index.cshtml dosyasının en üstüne aşağıdaki deyimi dahil etti:

@model IEnumerable<MvcMovie.Models.Movie>

yönergesi, denetleyicinin kesin olarak türü kesin olarak yazarak görünüme geçirilen @model Model filmlerin listesine erişim sağlar. Örneğin, Index.cshtml görünümünde kod, filmlerde türü kesin olarak kesin olarak yazılı nesne üzerinde bir foreach deyimiyle döngü Model oluşturur:

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

Nesne Model kesin bir şekilde bir nesne olarak IEnumerable<Movie> yazıldık, döngüde her öğe olarak Movie yazıldı. Derleyici, diğer avantajların arasında kodda kullanılan türleri doğrular.

SQL Entity Framework Core günlüğe kaydetme

Günlüğe kaydetme yapılandırması genellikle Logging appSettings'in bölümü tarafından sağlanır. {Environment} . JSON dosyaları. SQL deyimlerini günlüğe kaydetmek için, "Microsoft.EntityFrameworkCore.Database.Command": "Information" appsettings.Development.js dosyasına ekleyin:

{
  "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": "*"
}

önceki JSON ile, SQL deyimleri komut satırında ve Visual Studio çıkış penceresinde görüntülenir.

daha fazla bilgi için, bkz .NET Core ve ASP.NET Core'da günlük . ve bu GitHub sorunu.

Ek kaynaklar

Veri modeli sınıfı ekleme

Sınıf Ekle > modeller klasörüne sağ tıklayın > . Filmi. cs adlı dosyayı adlandırın.

Movie. cs dosyasını aşağıdaki kodla güncelleştirin:

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

MovieSınıfı, Id birincil anahtar için veritabanı için gerekli olan bir alanı içerir.

DataTypeÜzerindeki özniteliği, ReleaseDate veri türünü belirtir ( Date ). Bu öznitelikle:

  • Kullanıcının Tarih alanına saat bilgilerini girmesi gerekli değildir.
  • Zaman bilgisi değil yalnızca tarih görüntülenir.

Veri açıklamaları sonraki bir öğreticide ele alınmıştır.

NuGet paketlerini ekleme

araçlar menüsünde, NuGet Paket Yöneticisi > Paket Yöneticisi konsolu (PMC) seçeneğini belirleyin.

PMC menüsü

PMC 'de şu komutu çalıştırın:

Install-Package Microsoft.EntityFrameworkCore.SqlServer

yukarıdaki komut, EF Core SQL Server sağlayıcısını ekler. Sağlayıcı paketi, EF Core paketini bir bağımlılık olarak yüklüyor. Ek paketler, öğreticinin sonraki bölümlerinde bulunan yapı iskelesi adımında otomatik olarak yüklenir.

Veritabanı bağlamı sınıfı oluşturma

Model için EF Core işlevselliği (oluşturma, okuma, güncelleştirme, silme) koordine etmek için bir veritabanı bağlamı sınıfı gerekir Movie . Veritabanı bağlamı Microsoft. EntityFrameworkCore. DbContext öğesinden türetilir ve veri modeline dahil edilecek varlıkları belirtir.

Bir veri klasörü oluşturun.

Aşağıdaki kodla bir Data/MvcMovieContext. cs dosyası ekleyin:

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

Önceki kod, varlık kümesi için bir Dbset <Movie> özelliği oluşturur. Entity Framework terminolojisinde, genellikle bir varlık kümesi bir veritabanı tablosuna karşılık gelir. Bir varlık, tablodaki bir satıra karşılık gelir.

Veritabanı bağlamını kaydetme

ASP.NET Core, bağımlılık ekleme (dı)ile oluşturulmuştur. Hizmetlerin (EF Core DB bağlamı gibi) uygulama başlatma sırasında DI ile kayıtlı olması gerekir. Bu hizmetleri gerektiren bileşenler (örneğin, Razor Sayfalar), Oluşturucu parametreleri aracılığıyla sağlanır. Bir DB bağlam örneğini alan Oluşturucu kodu öğreticide daha sonra gösterilmiştir. Bu bölümde, veritabanı bağlamını dı kapsayıcısına kaydedersiniz.

using Başlangıç. cs' nin en üstüne aşağıdaki deyimleri ekleyin:

using MvcMovie.Data;
using Microsoft.EntityFrameworkCore;

Aşağıdaki Vurgulanan kodu içine ekleyin Startup.ConfigureServices :

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

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

Bağlantı dizesinin adı, Dbcontextoptions nesnesinde bir yöntem çağırarak bağlama geçirilir. yerel geliştirme için ASP.NET Core yapılandırma sistemi dosyadaki bağlantı dizesini okur appsettings.json .

Veritabanı bağlantı dizesini İnceleme

Dosyaya bir bağlantı dizesi ekleyin appsettings.json :

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

Projeyi derleyici hatalarına yönelik bir denetim olarak derleyin.

Yapı iskelesi film sayfaları

Film modeli için oluşturma, okuma, güncelleştirme ve silme (CRUD) sayfaları üretmek için scafkatlama aracını kullanın.

Çözüm Gezgini, denetleyiciler klasörüne sağ tıklayıp yeni > yapı iskelesi> öğesi ekleyin.

Yukarıdaki adımın görünümü

Yapı Ekle iletişim kutusunda, Entity Framework > Ekle ' yi kullanarak views ile MVC denetleyicisi ' ni seçin.

Yapı Iskelesi Ekle iletişim kutusu

Denetleyici Ekle iletişim kutusunu doldurun:

  • Model sınıfı: Film (mvcmovie. modeller)
  • Veri bağlamı sınıfı: mvcmoviecontext (mvcmovie. Data)

Veri bağlamı Ekle

  • Görünümler: Her seçeneğin varsayılan kısmını işaretli tut
  • Denetleyici adı: Varsayılan MoviesController tut
  • Ekle’yi seçin

Visual Studio şunu oluşturur:

  • Bir filmler denetleyicisi (denetleyiciler/MoviesController. cs)
  • Razor Oluşturma, silme, ayrıntılar, düzenleme ve dizin sayfaları için dosyaları görüntüleme (Görünümler/filmler/ * . cshtml)

Bu dosyaların otomatik olarak oluşturulması, Yapı iskelesi olarak bilinir.

Veritabanı mevcut olmadığından, scafkatmış sayfaları henüz kullanamazsınız. Uygulamayı çalıştırır ve film uygulaması bağlantısına tıklarsanız, bir veritabanı açılamıyor veya böyle bir tablo yok: film hata iletisi.

İlk geçiş

Veritabanını oluşturmak için EF Core geçişleri özelliğini kullanın. Geçişler, veri modelinizle eşleşecek bir veritabanı oluşturmanıza ve güncelleştirmenize olanak sağlayan bir araç kümesidir.

araçlar menüsünde, NuGet Paket Yöneticisi > Paket Yöneticisi konsolu (PMC) seçeneğini belirleyin.

PMC 'de aşağıdaki komutları girin:

Add-Migration InitialCreate
Update-Database
  • Add-Migration InitialCreate: Bir geçişler/{timestamp} _InitialCreate. cs geçiş dosyası oluşturur. InitialCreateBağımsız değişkeni geçiş adıdır. Herhangi bir ad kullanılabilir, ancak kurala göre, geçişi açıklayan bir ad seçilidir. Bu ilk geçiş olduğundan, oluşturulan sınıf veritabanı şemasını oluşturmak için kod içerir. Veritabanı şeması, sınıfında belirtilen modeli temel alır MvcMovieContext .

  • Update-Database: Veritabanını, önceki komutun oluşturulduğu en son geçişe güncelleştirir. Bu komut, Up veritabanını oluşturan geçişler/{Time-damga} _InitialCreate. cs dosyasında yöntemini çalıştırır.

    Database Update komutu aşağıdaki uyarıyı üretir:

    ' Movie ' varlık türündeki ' Price ' ondalık sütunu için tür belirtilmedi. Bu, varsayılan duyarlık ve ölçeğe uygun olmadıkları takdirde değerlerin sessizce kesilmesine neden olur. ' hasccolumntype () ' kullanarak tüm değerleri barındırabilecek SQL sunucusu sütun türünü açıkça belirtin.

    Bu uyarıyı yoksayabilirsiniz, daha sonraki bir öğreticide düzeltilecektir.

EF Core için PMC araçları hakkında daha fazla bilgi için bkz. Visual Studio 'da EF Core araçları başvurusu-PMC.

Initialcreate sınıfı

Geçişleri/{timestamp} _InitialCreate. cs geçiş dosyasını inceleyin:

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

UpYöntemi, film tablosunu oluşturur ve Id birincil anahtar olarak yapılandırır. DownYöntemi, geçiş tarafından yapılan şema değişikliklerini geri alır Up .

Uygulamayı test etme

  • Uygulamayı çalıştırın ve film uygulaması bağlantısına tıklayın.

    Aşağıdakilerden birine benzer bir özel durum alırsanız:

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

Muhtemelen geçişler adımınıkaçırdınız.

  • Oluştur sayfasını test edin. Veri girin ve gönderebilirsiniz.

    Not

    Alana ondalık virgüller giremeyebilirsiniz Price . Ondalık bir nokta ve US-English tarih biçimleri için virgül (",") kullanan Ingilizce olmayan yerel ayarlarda jQuery doğrulamasını desteklemek için, uygulamanın Genelleştirilmiş olması gerekir. genelleştirme yönergeleri için bu GitHub sorunabakın.

  • Düzenleme, Ayrıntılar ve silme sayfalarını test edin.

Denetleyiciye bağımlılık ekleme

Controllers/MoviesController. cs dosyasını açın ve oluşturucuyu inceleyin:

public class MoviesController : Controller
{
    private readonly MvcMovieContext _context;

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

Oluşturucu, veritabanı bağlamını () denetleyiciye eklemek için bağımlılık ekleme işlemini kullanır MvcMovieContext . Veritabanı bağlamı, denetleyicideki CRUD yöntemlerinde her birinde kullanılır.

Türü kesin belirlenmiş modeller ve @model anahtar sözcüğü

Bu öğreticide daha önce, bir denetleyicinin sözlüğü kullanarak bir görünüme nasıl veri veya nesne geçirekullanabileceğinizi gördünüz ViewData . ViewDataSözlük, bir görünüme bilgi geçirmek için uygun, geç bağlanan bir yol sağlayan dinamik bir nesnedir.

MVC Ayrıca, kesin olarak belirlenmiş model nesnelerini bir görünüme geçirmeye olanak tanır. Bu kesin türü belirtilmiş yaklaşım derleme zamanı kodu denetimini sunar. Yapı iskelesi mekanizması bu yaklaşımı (yani, türü kesin belirlenmiş bir model geçirerek) MoviesController sınıf ve görünümlerle kullandı.

Details Controllers/MoviesController. cs dosyasındaki oluşturulan yöntemi inceleyin:

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

idParametre genellikle rota verileri olarak geçirilir. Örneğin https://localhost:5001/movies/details/1 :

  • Denetleyicinin denetleyicisi movies (Ilk URL segmenti).
  • Eylem details (ıkıncı URL segmenti).
  • Kimliği 1 ' e (son URL segmenti).

Ayrıca, id aşağıdaki gibi bir sorgu dizesi ile de geçiş yapabilirsiniz:

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

Parametre, bir id kimlik değeri sağlanmadığından null yapılabilir bir tür () olarak tanımlanır int? .

Bir lambda ifadesi FirstOrDefaultAsync , rota verileriyle veya sorgu dizesi değeriyle eşleşen film varlıklarını seçmek için öğesine geçirilir.

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

Bir film bulunursa, Movie görünüme bir model örneği geçirilir Details :

return View(movie);

Görünümler/filmler/ayrıntılar. cshtml dosyasının içeriğini inceleyin:

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

@modelGörünüm dosyasının en üstündeki ifade, görünümün beklediği nesne türünü belirtir. Film denetleyicisi oluşturulduğunda, aşağıdaki @model ifade eklenmiştir:

@model MvcMovie.Models.Movie

Bu @model yönerge, denetleyicinin görünüme geçirildiği filme erişimine izin verir. ModelNesne kesin olarak belirlenmiş. Örneğin, details. cshtml görünümünde, kod her film alanını DisplayNameFor DisplayFor türü kesin belirlenmiş nesne ile HTML yardımcılarının içine geçirir Model . CreateVe Edit yöntemleri ve görünümleri de bir Movie model nesnesi iletir.

Index. cshtml görünümünü ve Index filmler denetleyicisindeki yöntemini inceleyin. Yöntemi çağırdığında kodun nasıl bir nesne oluşturduğunu fark edin List View . Kod bu Movies listeyi Index eylem yönteminden görünüme geçirir:

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

Film denetleyicisi oluşturulduğunda, yapı iskelesi @model Index. cshtml dosyasının en üstüne aşağıdaki ifadeyi içeriyordu:

@model IEnumerable<MvcMovie.Models.Movie>

@modelYönergesi, kesin olarak belirlenmiş bir nesne kullanarak denetleyicinin görünüme geçirildiği film listesine erişmenizi sağlar Model . Örneğin, Index. cshtml görünümünde, kod foreach kesin türü belirtilmiş nesne üzerinde bir deyimle birlikte filmlerde döngü yapılır Model :

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

ModelNesne türü kesin belirlenmiş olduğundan (bir nesne olarak IEnumerable<Movie> ), döngüdeki her öğe olarak yazılır Movie . Diğer avantajların yanı sıra, kodu derleme zaman denetimini alacağınız anlamına gelir.

Ek kaynaklar