Aracılığıyla paylaş


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

Not

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

Uyarı

ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

Önemli

Bu bilgiler, ticari olarak piyasaya sürülmeden önce önemli ölçüde değiştirilebilen bir yayın öncesi ürünle ilgilidir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.

Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

Rick Anderson ve Jon P Smith tarafından.

Bu öğreticide, bir veritabanındaki filmleri yönetmek için sınıflar eklenir. Bu sınıflar, MVC uygulamasının "Model" kısmıdır.

Bu model sınıfları, veritabanıyla çalışmak için 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ı Plain Old CLR Objects'ten POCO sınıfları olarak bilinir. POCO sınıflarının üzerinde EF Coreherhangi bir bağımlılığı yoktur. Bunlar yalnızca veritabanında depolanacak verilerin özelliklerini tanımlar.

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

Veri modeli sınıfı ekleme

Sınıf Ekle>Models klasörüne> sağ tıklayın. Dosyayı Movie.cs olarak adlandırın.

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

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

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

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

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

DataAnnotations , sonraki bir öğreticide ele alınmıştır.

Sonrasındaki soru işareti string özelliğin null atanabilir olduğunu gösterir. Daha fazla bilgi için bkz . Null atanabilir başvuru türleri.

NuGet paketlerini ekleme

Visual Studio gerekli paketleri otomatik olarak yükler.

Derleyici hatalarını denetlemek için projeyi derleyin.

yapı iskelesi film sayfaları

Film modeli için , , ReadUpdateve Delete (CRUD) sayfaları oluşturmak Createiçin iskele aracını kullanın.

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

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

Yeni İskeleli Öğe Ekle iletişim kutusunda:

  • Sol bölmede Yüklü Ortak>MVC'yi> seçin.
  • Entity Framework kullanarak görünümlere sahip MVC Denetleyicisi'ni seçin.
  • Ekle'yi seçin.

yapı iskelesi ekle iletişim kutusu

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

  • Model sınıfı açılan listesinde Film (MvcMovie.Models) öğ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.
    • Ekle'yi seçin.
  • Veritabanı sağlayıcısı açılan listesinde SQL Server'ı seçin.
  • Görünümler ve Denetleyici adı: Varsayılanı koruyun.
  • Ekle'yi seçin.

Veri bağlamı ekleme varsayılanları koru

Hata iletisi alırsanız yeniden denemek için İkinci kez ekle'yi seçin.

yapı iskelesi aşağıdaki paketleri ekler:

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

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

  • Film denetleyicisi: Controllers/MoviesController.cs
  • RazorOluş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

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

  • Proje dosyasına gerekli paket başvurularını MvcMovie.csproj ekler.
  • Veritabanı bağlamını dosyaya Program.cs kaydeder.
  • Dosyaya appsettings.json bir veritabanı bağlantı dizesi ekler.

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

Veritabanı mevcut olmadığından iskelesi oluşturulmuş sayfalar henüz kullanılamıyor. Uygulamayı çalıştırmak ve Film Uygulaması bağlantısını seçmek Veritabanı açılamıyor veya böyle bir tablo yok: Film hata iletisiyle sonuçlanır.

Hata olmadığını doğrulamak için uygulamayı oluşturun.

İlk geçiş

EF CoreVeritabanını oluşturmak için Geçişler özelliğini kullanın. Geçişler , bir veritabanını veri modeliyle eşleşecek şekilde oluşturan ve güncelleştiren bir araç kümesidir.

Araçlar menüsünde NuGet Paket Yöneticisi> Paket Yöneticisi Konsolu'nu seçin.

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

Add-Migration InitialCreate

  • Add-Migration InitialCreate: Bir Migrations/{timestamp}_InitialCreate.cs geçiş dosyası oluşturur. InitialCreate Bağımsız değişken, geçiş adıdır. Herhangi bir ad kullanılabilir, ancak kural gereği 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 MvcMovieContext modeli temel alır.

Sonraki bir adımda ele alınan aşağıdaki uyarı görüntülenir:

'Movie' varlık türündeki 'Price' ondalık özelliği için hiçbir mağaza türü belirtilmedi. Bu, varsayılan duyarlığa ve ölçeklendirmeye uymayan değerlerin sessizce kesilmesine neden olur. 'HasColumnType' kullanarak 'OnModelCreating' içindeki tüm değerleri barındırabilecek SQL server sütun türünü açıkça belirtin, 'HasPrecision' kullanarak duyarlık ve ölçek belirtin veya 'HasConversion' kullanarak bir değer dönüştürücü yapılandırın.

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

Update-Database

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

için PMC araçları hakkında daha fazla bilgi için EF Corebkz EF Core . Araçlar başvurusu - Visual Studio'da 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ırsanız, geçişler adımındaki komutu kaçırmış Update-Database olabilirsiniz:

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

Not

Alana ondalık virgül Price giremeyebilirsiniz. Ondalık ayırıcı ve ABD İngilizcesi olmayan tarih biçimleri için virgül (",") kullanan İngilizce olmayan yerel ayarlar için jQuery doğrulamasını desteklemek için uygulamanın genelleştirilmesi gerekir. Genelleştirme yönergeleri için bu GitHub sorununa bakın.

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

ile EF Coreveri erişimi bir model kullanılarak gerçekleştirilir. Model, varlık sınıflarından ve veritabanıyla bir oturumu temsil eden bir bağlam nesnesinden oluşur. Bağlam nesnesi, verileri sorgulamaya ve kaydetmeye olanak tanır. Veritabanı bağlamı Microsoft.EntityFrameworkCore.DbContext'ten türetilir ve veri modeline eklenecek varlıkları belirtir.

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

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

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

Bağımlılık ekleme

ASP.NET Core, bağımlılık ekleme (DI) ile derlenir. Veritabanı bağlamı gibi hizmetler içinde DI Program.csile kaydedilir. Bu hizmetler, oluşturucu parametreleri aracılığıyla bunları gerektiren bileşenlere sağlanır.

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

İskele, içinde Program.csaşağıdaki vurgulanmış kodu oluşturdu:

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

ASP.NET Core yapılandırma sistemi "MvcMovieContext" veritabanı bağlantı dizesi okur.

Oluşturulan veritabanı bağlantı dizesi inceleme

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

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

Yerel geliştirme için ASP.NET Core yapılandırma sistemi anahtarı dosyasından appsettings.json okurConnectionString.

Sınıfı InitialCreate

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

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

Önceki kodda:

  • InitialCreate.Up Movie tablosunu oluşturur ve birincil anahtar olarak yapılandırır Id .
  • InitialCreate.Down geçiş tarafından yapılan şema değişikliklerini geri döndürür Up .

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ı (MvcMovieContext) denetleyiciye eklemek için Bağımlılık Ekleme'yi kullanır. Veritabanı bağlamı, denetleyicideki CRUD yöntemlerinin her birinde kullanılır.

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

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

Kesin türemiş modeller ve @model yönergesi

Bu öğreticinin önceki bölümlerinde, bir denetleyicinin sözlüğü kullanarak ViewData verileri veya nesneleri bir görünüme nasıl geçirebileceğini gördünüz. ViewData Sözlük, bilgileri bir görünüme geçirmek için kullanışlı bir geç bağlı yol sağlayan dinamik bir nesnedir.

MVC, kesin olarak yazılan model nesnelerini bir görünüme geçirme olanağı sağlar. Bu kesin türemiş yaklaşım, derleme zamanı kod denetimini etkinleştirir. yapı iskelesi mekanizması, sınıf ve görünümlerde MoviesController kesin olarak belirlenmiş bir model geçirdi.

Details Oluşturulan yöntemi Controllers/MoviesController.cs dosyasında 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);
}

id parametresi genellikle yol verileri olarak geçirilir. Örneğin, https://localhost:5001/movies/details/1 ayarlar:

  • Denetleyicinin movies denetleyicisi, ilk URL kesimi.
  • detailseylemi, ikinci URL kesimidir.
  • Son id URL segmenti olan 1'e.

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

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

Parametreid, değerin sağlanmadığı id durumlarda null atanabilir bir tür (int?) olarak tanımlanır.

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

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

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

return View(movie);

Dosyanın içeriğini Views/Movies/Details.cshtml 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>

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

@model MvcMovie.Models.Movie

Bu @model yönerge, denetleyicinin görünüme iletmiş olduğu filme erişim sağlar. Model Nesne kesin olarak yazılır. Örneğin, görünümde Details.cshtml kod, her film alanını DisplayNameFor DisplayFor ve HTML Yardımcılarına kesin olarak yazılan Model nesneyle geçirir. Create ve Edit yöntemleri ve görünümleri de bir Movie model nesnesi geçirir.

Film denetleyicisindeki Index.cshtml görünümü ve Index yöntemini inceleyin. Kodun yöntemini çağırdığında nasıl bir List nesne oluşturduğuna View dikkat edin. Kod, bu Movies listeyi eylem yönteminden Index görünüme geçirir:

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

Kod, veri bağlamının Movie özelliği null olduğunda sorun ayrıntılarını döndürür.

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

@model IEnumerable<MvcMovie.Models.Movie>

yönergesi, @model kesin olarak yazılan bir Model nesne kullanarak denetleyicinin görünüme iletmiş olduğu film listesine erişim sağlar. Örneğin, görünümde Index.cshtml kod, kesin olarak yazılan Model nesnenin üzerinde bir foreach deyimle filmlerde döngü 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>

Model Nesne kesin olarak bir IEnumerable<Movie> nesne olarak yazıldığı için, döngüdeki her öğe olarak Movieyazılır. Derleyici, kodda kullanılan türleri doğrular.

Ek kaynaklar

Bu öğreticide, bir veritabanındaki filmleri yönetmek için sınıflar eklenir. Bu sınıflar, MVC uygulamasının "Model" kısmıdır.

Bu model sınıfları, veritabanıyla çalışmak için 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ı Plain Old CLR Objects'ten POCO sınıfları olarak bilinir. POCO sınıflarının üzerinde EF Coreherhangi bir bağımlılığı yoktur. Bunlar yalnızca veritabanında depolanacak verilerin özelliklerini tanımlar.

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

Veri modeli sınıfı ekleme

Sınıf Ekle>Models klasörüne> sağ tıklayın. Dosyayı Movie.cs olarak adlandırın.

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

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

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

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

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

DataAnnotations , sonraki bir öğreticide ele alınmıştır.

Sonrasındaki soru işareti string özelliğin null atanabilir olduğunu gösterir. Daha fazla bilgi için bkz . Null atanabilir başvuru türleri.

NuGet paketlerini ekleme

Visual Studio gerekli paketleri otomatik olarak yükler.

Derleyici hatalarını denetlemek için projeyi derleyin.

yapı iskelesi film sayfaları

Film modeli için , , ReadUpdateve Delete (CRUD) sayfaları oluşturmak Createiçin iskele aracını kullanın.

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

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

Yeni İskeleli Öğe Ekle iletişim kutusunda:

  • Sol bölmede Yüklü Ortak>MVC'yi> seçin.
  • Entity Framework kullanarak görünümlere sahip MVC Denetleyicisi'ni seçin.
  • Ekle'yi seçin.

yapı iskelesi ekle iletişim kutusu

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

  • Model sınıfı açılan listesinde Film (MvcMovie.Models) öğ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.
    • Ekle'yi seçin.
  • Veritabanı sağlayıcısı açılan listesinde SQL Server'ı seçin.
  • Görünümler ve Denetleyici adı: Varsayılanı koruyun.
  • Ekle'yi seçin.

Veri bağlamı ekleme varsayılanları koru

Hata iletisi alırsanız yeniden denemek için İkinci kez ekle'yi seçin.

yapı iskelesi aşağıdaki paketleri ekler:

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

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

  • Film denetleyicisi: Controllers/MoviesController.cs
  • RazorOluş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

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

  • Proje dosyasına gerekli paket başvurularını MvcMovie.csproj ekler.
  • Veritabanı bağlamını dosyaya Program.cs kaydeder.
  • Dosyaya appsettings.json bir veritabanı bağlantı dizesi ekler.

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

Veritabanı mevcut olmadığından iskelesi oluşturulmuş sayfalar henüz kullanılamıyor. Uygulamayı çalıştırmak ve Film Uygulaması bağlantısını seçmek Veritabanı açılamıyor veya böyle bir tablo yok: Film hata iletisiyle sonuçlanır.

Hata olmadığını doğrulamak için uygulamayı oluşturun.

İlk geçiş

EF CoreVeritabanını oluşturmak için Geçişler özelliğini kullanın. Geçişler , bir veritabanını veri modeliyle eşleşecek şekilde oluşturan ve güncelleştiren bir araç kümesidir.

Araçlar menüsünde NuGet Paket Yöneticisi> Paket Yöneticisi Konsolu'nu seçin.

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

Add-Migration InitialCreate
Update-Database

  • Add-Migration InitialCreate: Bir Migrations/{timestamp}_InitialCreate.cs geçiş dosyası oluşturur. InitialCreate Bağımsız değişken, geçiş adıdır. Herhangi bir ad kullanılabilir, ancak kural gereği 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 MvcMovieContext modeli temel alır.

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

komutu Update-Database aşağıdaki uyarıyı oluşturur:

'Movie' varlık türündeki 'Price' ondalık özelliği için hiçbir mağaza türü belirtilmedi. Bu, varsayılan duyarlığa ve ölçeklendirmeye uymayan değerlerin sessizce kesilmesine neden olur. 'HasColumnType' kullanarak 'OnModelCreating' içindeki tüm değerleri barındırabilecek SQL server sütun türünü açıkça belirtin, 'HasPrecision' kullanarak duyarlık ve ölçek belirtin veya 'HasConversion' kullanarak bir değer dönüştürücü yapılandırın.

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

için PMC araçları hakkında daha fazla bilgi için EF Corebkz EF Core . Araçlar başvurusu - Visual Studio'da 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ırsanız, geçişler adımındaki komutu kaçırmış Update-Database olabilirsiniz:

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

Not

Alana ondalık virgül Price giremeyebilirsiniz. Ondalık ayırıcı ve ABD İngilizcesi olmayan tarih biçimleri için virgül (",") kullanan İngilizce olmayan yerel ayarlar için jQuery doğrulamasını desteklemek için uygulamanın genelleştirilmesi gerekir. Genelleştirme yönergeleri için bu GitHub sorununa bakın.

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

ile EF Coreveri erişimi bir model kullanılarak gerçekleştirilir. Model, varlık sınıflarından ve veritabanıyla bir oturumu temsil eden bir bağlam nesnesinden oluşur. Bağlam nesnesi, verileri sorgulamaya ve kaydetmeye olanak tanır. Veritabanı bağlamı Microsoft.EntityFrameworkCore.DbContext'ten türetilir ve veri modeline eklenecek varlıkları belirtir.

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

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

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

Bağımlılık ekleme

ASP.NET Core, bağımlılık ekleme (DI) ile derlenir. Veritabanı bağlamı gibi hizmetler içinde DI Program.csile kaydedilir. Bu hizmetler, oluşturucu parametreleri aracılığıyla bunları gerektiren bileşenlere sağlanır.

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

İskele, içinde Program.csaşağıdaki vurgulanmış kodu oluşturdu:

var builder = WebApplication.CreateBuilder(args);

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

ASP.NET Core yapılandırma sistemi "MvcMovieContext" veritabanı bağlantı dizesi okur.

Oluşturulan veritabanı bağlantı dizesi inceleme

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

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

Yerel geliştirme için ASP.NET Core yapılandırma sistemi anahtarı dosyasından appsettings.json okurConnectionString.

Sınıfı InitialCreate

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

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

Önceki kodda:

  • InitialCreate.Up Movie tablosunu oluşturur ve birincil anahtar olarak yapılandırır Id .
  • InitialCreate.Down geçiş tarafından yapılan şema değişikliklerini geri döndürür Up .

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ı (MvcMovieContext) denetleyiciye eklemek için Bağımlılık Ekleme'yi kullanır. Veritabanı bağlamı, denetleyicideki CRUD yöntemlerinin her birinde kullanılır.

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

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

Kesin türemiş modeller ve @model yönergesi

Bu öğreticinin önceki bölümlerinde, bir denetleyicinin sözlüğü kullanarak ViewData verileri veya nesneleri bir görünüme nasıl geçirebileceğini gördünüz. ViewData Sözlük, bilgileri bir görünüme geçirmek için kullanışlı bir geç bağlı yol sağlayan dinamik bir nesnedir.

MVC, kesin olarak yazılan model nesnelerini bir görünüme geçirme olanağı sağlar. Bu kesin türemiş yaklaşım, derleme zamanı kod denetimini etkinleştirir. yapı iskelesi mekanizması, sınıf ve görünümlerde MoviesController kesin olarak belirlenmiş bir model geçirdi.

Details Oluşturulan yöntemi Controllers/MoviesController.cs dosyasında 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);
}

id parametresi genellikle yol verileri olarak geçirilir. Örneğin, https://localhost:5001/movies/details/1 ayarlar:

  • Denetleyicinin movies denetleyicisi, ilk URL kesimi.
  • detailseylemi, ikinci URL kesimidir.
  • Son id URL segmenti olan 1'e.

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

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

Parametreid, değerin sağlanmadığı id durumlarda null atanabilir bir tür (int?) olarak tanımlanır.

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

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

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

return View(movie);

Dosyanın içeriğini Views/Movies/Details.cshtml 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>

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

@model MvcMovie.Models.Movie

Bu @model yönerge, denetleyicinin görünüme iletmiş olduğu filme erişim sağlar. Model Nesne kesin olarak yazılır. Örneğin, görünümde Details.cshtml kod, her film alanını DisplayNameFor DisplayFor ve HTML Yardımcılarına kesin olarak yazılan Model nesneyle geçirir. Create ve Edit yöntemleri ve görünümleri de bir Movie model nesnesi geçirir.

Film denetleyicisindeki Index.cshtml görünümü ve Index yöntemini inceleyin. Kodun yöntemini çağırdığında nasıl bir List nesne oluşturduğuna View dikkat edin. Kod, bu Movies listeyi eylem yönteminden Index görünüme geçirir:

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

Kod, veri bağlamının Movie özelliği null olduğunda sorun ayrıntılarını döndürür.

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

@model IEnumerable<MvcMovie.Models.Movie>

yönergesi, @model kesin olarak yazılan bir Model nesne kullanarak denetleyicinin görünüme iletmiş olduğu film listesine erişim sağlar. Örneğin, görünümde Index.cshtml kod, kesin olarak yazılan Model nesnenin üzerinde bir foreach deyimle filmlerde döngü 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>

Model Nesne kesin olarak bir IEnumerable<Movie> nesne olarak yazıldığı için, döngüdeki her öğe olarak Movieyazılır. Derleyici, kodda kullanılan türleri doğrular.

Ek kaynaklar

Bu öğreticide, bir veritabanındaki filmleri yönetmek için sınıflar eklenir. Bu sınıflar, MVC uygulamasının "Model" kısmıdır.

Bu model sınıfları, veritabanıyla çalışmak için 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ı Plain Old CLR Objects'ten POCO sınıfları olarak bilinir. POCO sınıflarının üzerinde EF Coreherhangi bir bağımlılığı yoktur. Bunlar yalnızca veritabanında depolanacak verilerin özelliklerini tanımlar.

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

Veri modeli sınıfı ekleme

Sınıf Ekle>Models klasörüne> sağ tıklayın. Dosyayı Movie.cs olarak adlandırın.

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

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

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

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

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

DataAnnotations , sonraki bir öğreticide ele alınmıştır.

Sonrasındaki soru işareti string özelliğin null atanabilir olduğunu gösterir. Daha fazla bilgi için bkz . Null atanabilir başvuru türleri.

NuGet paketlerini ekleme

Visual Studio gerekli paketleri otomatik olarak yükler.

Derleyici hatalarını denetlemek için projeyi derleyin.

yapı iskelesi film sayfaları

Film modeli için , , ReadUpdateve Delete (CRUD) sayfaları oluşturmak Createiçin iskele aracını kullanın.

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

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

Yeni İskeleli Öğe Ekle iletişim kutusunda:

  • Sol bölmede Yüklü Ortak>MVC'yi> seçin.
  • Entity Framework kullanarak görünümlere sahip MVC Denetleyicisi'ni seçin.
  • Ekle'yi seçin.

yapı iskelesi ekle iletişim kutusu

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

  • Model sınıfı açılan listesinde Film (MvcMovie.Models) öğ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.
    • Ekle'yi seçin.
  • Veritabanı sağlayıcısı açılan listesinde SQL Server'ı seçin.
  • Görünümler ve Denetleyici adı: Varsayılanı koruyun.
  • Ekle'yi seçin.

Veri bağlamı ekleme varsayılanları koruHata iletisi alırsanız yeniden denemek için İkinci kez ekle'yi seçin.

yapı iskelesi aşağıdaki paketleri ekler:

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

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

  • Film denetleyicisi: Controllers/MoviesController.cs
  • RazorOluş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

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

  • Proje dosyasına gerekli paket başvurularını MvcMovie.csproj ekler.
  • Veritabanı bağlamını dosyaya Program.cs kaydeder.
  • Dosyaya appsettings.json bir veritabanı bağlantı dizesi ekler.

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

Veritabanı mevcut olmadığından iskelesi oluşturulmuş sayfalar henüz kullanılamıyor. Uygulamayı çalıştırmak ve Film Uygulaması bağlantısını seçmek Veritabanı açılamıyor veya böyle bir tablo yok: Film hata iletisiyle sonuçlanır.

Hata olmadığını doğrulamak için uygulamayı oluşturun.

İlk geçiş

EF CoreVeritabanını oluşturmak için Geçişler özelliğini kullanın. Geçişler , bir veritabanını veri modeliyle eşleşecek şekilde oluşturan ve güncelleştiren bir araç kümesidir.

Araçlar menüsünde NuGet Paket Yöneticisi> Paket Yöneticisi Konsolu'nu seçin.

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

Add-Migration InitialCreate
Update-Database

  • Add-Migration InitialCreate: Bir Migrations/{timestamp}_InitialCreate.cs geçiş dosyası oluşturur. InitialCreate Bağımsız değişken, geçiş adıdır. Herhangi bir ad kullanılabilir, ancak kural gereği 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 MvcMovieContext modeli temel alır.

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

komutu Update-Database aşağıdaki uyarıyı oluşturur:

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

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

için PMC araçları hakkında daha fazla bilgi için EF Corebkz EF Core . Araçlar başvurusu - Visual Studio'da 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ırsanız, geçişler adımındaki komutu kaçırmış Update-Database olabilirsiniz:

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

Not

Alana ondalık virgül Price giremeyebilirsiniz. Ondalık ayırıcı ve ABD İngilizcesi olmayan tarih biçimleri için virgül (",") kullanan İngilizce olmayan yerel ayarlar için jQuery doğrulamasını desteklemek için uygulamanın genelleştirilmesi gerekir. Genelleştirme yönergeleri için bu GitHub sorununa bakın.

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

ile EF Coreveri erişimi bir model kullanılarak gerçekleştirilir. Model, varlık sınıflarından ve veritabanıyla bir oturumu temsil eden bir bağlam nesnesinden oluşur. Bağlam nesnesi, verileri sorgulamaya ve kaydetmeye olanak tanır. Veritabanı bağlamı Microsoft.EntityFrameworkCore.DbContext'ten türetilir ve veri modeline eklenecek varlıkları belirtir.

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

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

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

Bağımlılık ekleme

ASP.NET Core, bağımlılık ekleme (DI) ile derlenir. Veritabanı bağlamı gibi hizmetler içinde DI Program.csile kaydedilir. Bu hizmetler, oluşturucu parametreleri aracılığıyla bunları gerektiren bileşenlere sağlanır.

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

İskele, içinde Program.csaşağıdaki vurgulanmış kodu oluşturdu:

var builder = WebApplication.CreateBuilder(args);

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

ASP.NET Core yapılandırma sistemi "MvcMovieContext" veritabanı bağlantı dizesi okur.

Oluşturulan veritabanı bağlantı dizesi inceleme

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

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

Yerel geliştirme için ASP.NET Core yapılandırma sistemi anahtarı dosyasından appsettings.json okurConnectionString.

Sınıfı InitialCreate

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

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

Önceki kodda:

  • InitialCreate.Up Movie tablosunu oluşturur ve birincil anahtar olarak yapılandırır Id .
  • InitialCreate.Down geçiş tarafından yapılan şema değişikliklerini geri döndürür Up .

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ı (MvcMovieContext) denetleyiciye eklemek için Bağımlılık Ekleme'yi kullanır. Veritabanı bağlamı, denetleyicideki CRUD yöntemlerinin her birinde kullanılır.

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

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

Kesin türemiş modeller ve @model yönergesi

Bu öğreticinin önceki bölümlerinde, bir denetleyicinin sözlüğü kullanarak ViewData verileri veya nesneleri bir görünüme nasıl geçirebileceğini gördünüz. ViewData Sözlük, bilgileri bir görünüme geçirmek için kullanışlı bir geç bağlı yol sağlayan dinamik bir nesnedir.

MVC, kesin olarak yazılan model nesnelerini bir görünüme geçirme olanağı sağlar. Bu kesin türemiş yaklaşım, derleme zamanı kod denetimini etkinleştirir. yapı iskelesi mekanizması, sınıf ve görünümlerde MoviesController kesin olarak belirlenmiş bir model geçirdi.

Details Oluşturulan yöntemi Controllers/MoviesController.cs dosyasında 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);
}

id parametresi genellikle yol verileri olarak geçirilir. Örneğin, https://localhost:5001/movies/details/1 ayarlar:

  • Denetleyicinin movies denetleyicisi, ilk URL kesimi.
  • detailseylemi, ikinci URL kesimidir.
  • Son id URL segmenti olan 1'e.

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

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

Parametreid, değerin sağlanmadığı id durumlarda null atanabilir bir tür (int?) olarak tanımlanır.

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

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

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

return View(movie);

Dosyanın içeriğini Views/Movies/Details.cshtml 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>

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

@model MvcMovie.Models.Movie

Bu @model yönerge, denetleyicinin görünüme iletmiş olduğu filme erişim sağlar. Model Nesne kesin olarak yazılır. Örneğin, görünümde Details.cshtml kod, her film alanını DisplayNameFor DisplayFor ve HTML Yardımcılarına kesin olarak yazılan Model nesneyle geçirir. Create ve Edit yöntemleri ve görünümleri de bir Movie model nesnesi geçirir.

Film denetleyicisindeki Index.cshtml görünümü ve Index yöntemini inceleyin. Kodun yöntemini çağırdığında nasıl bir List nesne oluşturduğuna View dikkat edin. Kod, bu Movies listeyi eylem yönteminden Index görünüme geçirir:

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

Kod, veri bağlamının Movie özelliği null olduğunda sorun ayrıntılarını döndürür.

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

@model IEnumerable<MvcMovie.Models.Movie>

yönergesi, @model kesin olarak yazılan bir Model nesne kullanarak denetleyicinin görünüme iletmiş olduğu film listesine erişim sağlar. Örneğin, görünümde Index.cshtml kod, kesin olarak yazılan Model nesnenin üzerinde bir foreach deyimle filmlerde döngü 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>

Model Nesne kesin olarak bir IEnumerable<Movie> nesne olarak yazıldığı için, döngüdeki her öğe olarak Movieyazılır. Derleyici, kodda kullanılan türleri doğrular.

Ek kaynaklar

Bu öğreticide, bir veritabanındaki filmleri yönetmek için sınıflar eklenir. Bu sınıflar, MVC uygulamasının "Model" kısmıdır.

Bu model sınıfları, veritabanıyla çalışmak için 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ı Plain Old CLR Objects'ten POCO sınıfları olarak bilinir. POCO sınıflarının üzerinde EF Coreherhangi bir bağımlılığı yoktur. Bunlar yalnızca veritabanında depolanacak verilerin özelliklerini tanımlar.

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

Veri modeli sınıfı ekleme

Sınıf Ekle>Models klasörüne> sağ tıklayın. Dosyayı Movie.cs olarak adlandırın.

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

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

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

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

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

DataAnnotations , sonraki bir öğreticide ele alınmıştır.

Sonrasındaki soru işareti string özelliğin null atanabilir olduğunu gösterir. Daha fazla bilgi için bkz . Null atanabilir başvuru türleri.

NuGet paketlerini ekleme

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

PMC menüsü

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

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

Yukarıdaki komutlar aşağıdakileri ekler:

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

Derleyici hatalarını denetlemek için projeyi derleyin.

yapı iskelesi film sayfaları

Film modeli için , , ReadUpdateve Delete (CRUD) sayfaları oluşturmak Createiçin iskele aracını kullanın.

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

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

yapı iskelesi ekle iletişim kutusunda, Entity Framework > Ekle'yi kullanarak görünümlere sahip MVC Denetleyicisi'ni seçin.

yapı iskelesi ekle iletişim kutusu

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

  • Model sınıfı açılan listesinde Film (MvcMovie.Models) öğ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.
    • Ekle'yi seçin.
  • Görünümler ve Denetleyici adı: Varsayılanı koruyun.
  • Ekle'yi seçin.

Veri bağlamı ekleme varsayılanları koru

Hata iletisi alırsanız yeniden denemek için İkinci kez ekle'yi seçin.

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

  • Proje dosyasına gerekli paket başvurularını MvcMovie.csproj ekler.
  • Veritabanı bağlamını dosyaya Program.cs kaydeder.
  • Dosyaya appsettings.json bir veritabanı bağlantı dizesi ekler.

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

  • Film denetleyicisi: Controllers/MoviesController.cs
  • RazorOluş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 olmadığından iskelesi oluşturulmuş sayfalar henüz kullanılamıyor. Uygulamayı çalıştırmak ve Film Uygulaması bağlantısını seçmek Veritabanı açılamıyor veya böyle bir tablo yok: Film hata iletisiyle sonuçlanır.

Uygulamayı oluşturma

Uygulamayı oluşturun. Derleyici, değerlerin nasıl null işleneceğini gösteren birkaç uyarı oluşturur. Daha fazla bilgi için bu GitHub sorununa ve Null atanabilir başvuru türlerine bakın.

Boş değer atanabilir başvuru türlerindeki uyarıları ortadan kaldırmak için dosyadan MvcMovie.csproj aşağıdaki satırı kaldırın:

<Nullable>enable</Nullable>

Bu sorunu bir sonraki sürümde çözmeyi umuyoruz.

İlk geçiş

EF CoreVeritabanını oluşturmak için Geçişler özelliğini kullanın. Geçişler , bir veritabanını veri modeliyle eşleşecek şekilde oluşturan ve güncelleştiren bir araç kümesidir.

Araçlar menüsünde NuGet Paket Yöneticisi> Paket Yöneticisi Konsolu'nu seçin.

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

Add-Migration InitialCreate
Update-Database

  • Add-Migration InitialCreate: Bir Migrations/{timestamp}_InitialCreate.cs geçiş dosyası oluşturur. InitialCreate Bağımsız değişken, geçiş adıdır. Herhangi bir ad kullanılabilir, ancak kural gereği 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 MvcMovieContext modeli temel alır.

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

komutu Update-Database aşağıdaki uyarıyı oluşturur:

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

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

için PMC araçları hakkında daha fazla bilgi için EF Corebkz EF Core . Araçlar başvurusu - Visual Studio'da 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ırsanız geçişler adımını kaçırmış olabilirsiniz:

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

Not

Alana ondalık virgül Price giremeyebilirsiniz. Ondalık ayırıcı ve ABD İngilizcesi olmayan tarih biçimleri için virgül (",") kullanan İngilizce olmayan yerel ayarlar için jQuery doğrulamasını desteklemek için uygulamanın genelleştirilmesi gerekir. Genelleştirme yönergeleri için bu GitHub sorununa bakın.

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

ile EF Coreveri erişimi bir model kullanılarak gerçekleştirilir. Model, varlık sınıflarından ve veritabanıyla bir oturumu temsil eden bir bağlam nesnesinden oluşur. Bağlam nesnesi, verileri sorgulamaya ve kaydetmeye olanak tanır. Veritabanı bağlamı Microsoft.EntityFrameworkCore.DbContext'ten türetilir ve veri modeline eklenecek varlıkları belirtir.

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

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

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

Bağımlılık ekleme

ASP.NET Core, bağımlılık ekleme (DI) ile derlenir. Veritabanı bağlamı gibi hizmetler içinde DI Program.csile kaydedilir. Bu hizmetler, oluşturucu parametreleri aracılığıyla bunları gerektiren bileşenlere sağlanır.

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

İskele, içinde Program.csaşağıdaki vurgulanmış kodu oluşturdu:

var builder = WebApplication.CreateBuilder(args);

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

ASP.NET Core yapılandırma sistemi "MvcMovieContext" veritabanı bağlantı dizesi okur.

Oluşturulan veritabanı bağlantı dizesi inceleme

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

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

Yerel geliştirme için ASP.NET Core yapılandırma sistemi anahtarı dosyasından appsettings.json okurConnectionString.

Sınıfı InitialCreate

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

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

Önceki kodda:

  • InitialCreate.Up Movie tablosunu oluşturur ve birincil anahtar olarak yapılandırır Id .
  • InitialCreate.Down geçiş tarafından yapılan şema değişikliklerini geri döndürür Up .

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ı (MvcMovieContext) denetleyiciye eklemek için Bağımlılık Ekleme'yi kullanır. Veritabanı bağlamı, denetleyicideki CRUD yöntemlerinin her birinde kullanılır.

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

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

Kesin türemiş modeller ve @model yönergesi

Bu öğreticinin önceki bölümlerinde, bir denetleyicinin sözlüğü kullanarak ViewData verileri veya nesneleri bir görünüme nasıl geçirebileceğini gördünüz. ViewData Sözlük, bilgileri bir görünüme geçirmek için kullanışlı bir geç bağlı yol sağlayan dinamik bir nesnedir.

MVC, kesin olarak yazılan model nesnelerini bir görünüme geçirme olanağı sağlar. Bu kesin türemiş yaklaşım, derleme zamanı kod denetimini etkinleştirir. yapı iskelesi mekanizması, sınıf ve görünümlerde MoviesController kesin olarak belirlenmiş bir model geçirdi.

Details Oluşturulan yöntemi Controllers/MoviesController.cs dosyasında 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);
}

id parametresi genellikle yol verileri olarak geçirilir. Örneğin, https://localhost:5001/movies/details/1 ayarlar:

  • Denetleyicinin movies denetleyicisi, ilk URL kesimi.
  • detailseylemi, ikinci URL kesimidir.
  • Son id URL segmenti olan 1'e.

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

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

Parametreid, değerin sağlanmadığı id durumlarda null atanabilir bir tür (int?) olarak tanımlanır.

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

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

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

return View(movie);

Dosyanın içeriğini Views/Movies/Details.cshtml 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>

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

@model MvcMovie.Models.Movie

Bu @model yönerge, denetleyicinin görünüme iletmiş olduğu filme erişim sağlar. Model Nesne kesin olarak yazılır. Örneğin, görünümde Details.cshtml kod, her film alanını DisplayNameFor DisplayFor ve HTML Yardımcılarına kesin olarak yazılan Model nesneyle geçirir. Create ve Edit yöntemleri ve görünümleri de bir Movie model nesnesi geçirir.

Film denetleyicisindeki Index.cshtml görünümü ve Index yöntemini inceleyin. Kodun yöntemini çağırdığında nasıl bir List nesne oluşturduğuna View dikkat edin. Kod, bu Movies listeyi eylem yönteminden Index 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 dosyanın en üstüne aşağıdaki @model deyimini dahil etti Index.cshtml :

@model IEnumerable<MvcMovie.Models.Movie>

yönergesi, @model kesin olarak yazılan bir Model nesne kullanarak denetleyicinin görünüme iletmiş olduğu film listesine erişim sağlar. Örneğin, görünümde Index.cshtml kod, kesin olarak yazılan Model nesnenin üzerinde bir foreach deyimle filmlerde döngü 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>

Model Nesne kesin olarak bir IEnumerable<Movie> nesne olarak yazıldığı için, döngüdeki her öğe olarak Movieyazılır. Derleyici, kodda kullanılan türleri doğrular.

Ek kaynaklar

Bu öğreticide, bir veritabanındaki filmleri yönetmek için sınıflar eklenir. Bu sınıflar, MVC uygulamasının "Model" kısmıdır.

Bu model sınıfları, veritabanıyla çalışmak için 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ı Plain Old CLR Objects'ten POCO sınıfları olarak bilinir. POCO sınıflarının üzerinde EF Coreherhangi bir bağımlılığı yoktur. Bunlar yalnızca veritabanında depolanacak verilerin özelliklerini tanımlar.

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

Veri modeli sınıfı ekleme

Sınıf Ekle>Models klasörüne> sağ tıklayın. Dosyayı Movie.cs olarak adlandırın.

Models/Movie.cs Dosyayı 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; }
    }
}

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

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

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

DataAnnotations , 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) öğesini seçin.

PMC menüsü

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

Install-Package Microsoft.EntityFrameworkCore.Design

Yukarıdaki komutlar aşağıdakileri ekler:

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

Derleyici hatalarını denetlemek için projeyi derleyin.

yapı iskelesi film sayfaları

Film modeli için , , ReadUpdateve Delete (CRUD) sayfaları oluşturmak Createiçin iskele aracını kullanın.

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

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

yapı iskelesi ekle iletişim kutusunda, Entity Framework > Ekle'yi kullanarak görünümlere sahip MVC Denetleyicisi'ni seçin.

yapı iskelesi ekle iletişim kutusu

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

  • Model sınıfı açılan listesinde Film (MvcMovie.Models) öğ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.
    • Ekle'yi seçin.
  • Görünümler ve Denetleyici adı: Varsayılanı koruyun.
  • Ekle'yi seçin.

Veri bağlamı ekleme varsayılanları koru

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

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

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

  • Film denetleyicisi: Controllers/MoviesController.cs
  • RazorOluş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 olmadığından iskelesi oluşturulmuş sayfalar henüz kullanılamıyor. Uygulamayı çalıştırmak ve Film Uygulaması bağlantısını seçmek Veritabanı açılamıyor veya böyle bir tablo yok: Film hata iletisiyle sonuçlanır.

İlk geçiş

EF CoreVeritabanını oluşturmak için Geçişler özelliğini kullanın. Geçişler, bir veritabanını veri modeliyle eşleşecek şekilde oluşturan ve güncelleştiren bir araç kümesidir.

Araçlar menüsünde NuGet Paket Yöneticisi> Paket Yöneticisi Konsolu'nu seçin.

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

Add-Migration InitialCreate
Update-Database

  • Add-Migration InitialCreate: Bir Migrations/{timestamp}_InitialCreate.cs geçiş dosyası oluşturur. InitialCreate Bağımsız değişken, geçiş adıdır. Herhangi bir ad kullanılabilir, ancak kural gereği 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 MvcMovieContext modeli temel alır.

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

komutu Update-Database aşağıdaki uyarıyı oluşturur:

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

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

için PMC araçları hakkında daha fazla bilgi için EF Corebkz EF Core . Araçlar başvurusu - Visual Studio'da 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ırsanız geçişler adımını kaçırmış olabilirsiniz:

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

Not

Alana ondalık virgül Price giremeyebilirsiniz. Ondalık ayırıcı ve ABD İngilizcesi olmayan tarih biçimleri için virgül (",") kullanan İngilizce olmayan yerel ayarlar için jQuery doğrulamasını desteklemek için uygulamanın genelleştirilmesi gerekir. Genelleştirme yönergeleri için bu GitHub sorununa bakın.

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

ile EF Coreveri erişimi bir model kullanılarak gerçekleştirilir. Model, varlık sınıflarından ve veritabanıyla bir oturumu temsil eden bir bağlam nesnesinden oluşur. Bağlam nesnesi, verileri sorgulamaya ve kaydetmeye olanak tanır. Veritabanı bağlamı Microsoft.EntityFrameworkCore.DbContext'ten türetilir ve veri modeline eklenecek varlıkları belirtir.

yapı iskelesi, veritabanı bağlam sınıfını Data/MvcMovieContext.cs 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 filmleri temsil eden bir DbSet<Movie> özelliği oluşturur.

ASP.NET Core, bağımlılık ekleme (DI) ile derlenir. Veritabanı bağlamı gibi hizmetlerin içinde StartupDI'ye kaydedilmesi 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 eklemek MvcMovieContext için Bağımlılık Ekleme'yi kullanır. Veritabanı bağlamı, denetleyicideki CRUD yöntemlerinin her birinde kullanılır.

İskele, içinde Startup.ConfigureServicesaşağıdaki vurgulanmış kodu oluşturdu:

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

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

ASP.NET Core yapılandırma sistemi "MvcMovieContext" veritabanı bağlantı dizesi okur.

Oluşturulan veritabanı bağlantı dizesi inceleme

yapı iskelesi dosyaya appsettings.json bir bağlantı dizesi 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 yapılandırma sistemi anahtarı dosyasından appsettings.json okurConnectionString.

Sınıfı InitialCreate

Migrations/{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>(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");
    }
}

Önceki kodda:

  • InitialCreate.Up Movie tablosunu oluşturur ve birincil anahtar olarak yapılandırır Id .
  • InitialCreate.Down geçiş tarafından yapılan şema değişikliklerini geri döndürür Up .

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ı (MvcMovieContext) denetleyiciye eklemek için Bağımlılık Ekleme'yi kullanır. Veritabanı bağlamı, denetleyicideki CRUD yöntemlerinin her birinde kullanılır.

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

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

Kesin türemiş modeller ve @model yönergesi

Bu öğreticinin önceki bölümlerinde, bir denetleyicinin sözlüğü kullanarak ViewData verileri veya nesneleri bir görünüme nasıl geçirebileceğini gördünüz. ViewData Sözlük, bilgileri bir görünüme geçirmek için kullanışlı bir geç bağlı yol sağlayan dinamik bir nesnedir.

MVC, kesin olarak yazılan model nesnelerini bir görünüme geçirme olanağı sağlar. Bu kesin türemiş yaklaşım, derleme zamanı kod denetimini etkinleştirir. yapı iskelesi mekanizması, sınıf ve görünümlerde MoviesController kesin olarak belirlenmiş bir model geçirdi.

Details Oluşturulan yöntemi Controllers/MoviesController.cs dosyasında 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);
}

id parametresi genellikle yol verileri olarak geçirilir. Örneğin, https://localhost:5001/movies/details/1 ayarlar:

  • Denetleyicinin movies denetleyicisi, ilk URL kesimi.
  • detailseylemi, ikinci URL kesimidir.
  • Son id URL segmenti olan 1'e.

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

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

Parametreid, değerin sağlanmadığı id durumlarda null atanabilir bir tür (int?) olarak tanımlanır.

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

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

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

return View(movie);

Dosyanın içeriğini Views/Movies/Details.cshtml 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>

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

@model MvcMovie.Models.Movie

Bu @model yönerge, denetleyicinin görünüme iletmiş olduğu filme erişim sağlar. Model Nesne kesin olarak yazılır. Örneğin, görünümde Details.cshtml kod, her film alanını DisplayNameFor DisplayFor ve HTML Yardımcılarına kesin olarak yazılan Model nesneyle geçirir. Create ve Edit yöntemleri ve görünümleri de bir Movie model nesnesi geçirir.

Film denetleyicisindeki Index.cshtml görünümü ve Index yöntemini inceleyin. Kodun yöntemini çağırdığında nasıl bir List nesne oluşturduğuna View dikkat edin. Kod, bu Movies listeyi eylem yönteminden Index 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 dosyanın en üstüne aşağıdaki @model deyimini dahil etti Index.cshtml :

@model IEnumerable<MvcMovie.Models.Movie>

yönergesi, @model kesin olarak yazılan bir Model nesne kullanarak denetleyicinin görünüme iletmiş olduğu film listesine erişim sağlar. Örneğin, görünümde Index.cshtml kod, kesin olarak yazılan Model nesnenin üzerinde bir foreach deyimle filmlerde döngü 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>

Model Nesne kesin olarak bir IEnumerable<Movie> nesne olarak yazıldığı için, döngüdeki her öğe olarak Movieyazılır. Derleyici, kodda kullanılan türleri doğrular.

Entity Framework Core'un SQL Günlüğü

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

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

Yukarıdaki 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üğe kaydetme ve bu GitHub sorunu.

Ek kaynaklar

Bu öğreticide, bir veritabanındaki filmleri yönetmek için sınıflar eklenir. Bu sınıflar, MVC uygulamasının "Model" kısmıdır.

Bu model sınıfları, veritabanıyla çalışmak için 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ı Plain Old CLR Objects'ten POCO sınıfları olarak bilinir. POCO sınıflarının üzerinde EF Coreherhangi bir bağımlılığı yoktur. Bunlar yalnızca veritabanında depolanacak verilerin özelliklerini tanımlar.

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

Veri modeli sınıfı ekleme

Sınıf Ekle>Models klasörüne> sağ tıklayın. Dosyayı Movie.cs olarak adlandırın.

Movie.cs Dosyayı 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; }
    }
}

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

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

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

DataAnnotations , 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) öğesini seçin.

PMC menüsü

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

Install-Package Microsoft.EntityFrameworkCore.SqlServer

Yukarıdaki komut SQL Server sağlayıcısını EF Core ekler. Sağlayıcı paketi, paketi bağımlılık olarak yükler EF Core . Ek paketler, öğreticinin ilerleyen bölümlerindeki yapı iskelesi adımında otomatik olarak yüklenir.

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

Modelin işlevselliğini (Oluşturma, Okuma, Güncelleştirme, Silme) koordine EF Core etmek için Movie bir veritabanı bağlam sınıfı gereklidir. Veritabanı bağlamı' ndan Microsoft.EntityFrameworkCore.DbContext türetilir ve veri modeline eklenecek varlıkları belirtir.

Veri klasörü oluşturun.

Aşağıdaki koda sahip bir Data/MvcMovieContext.cs dosya 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; }
    }
}

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

Veritabanı bağlamını kaydetme

ASP.NET Core, bağımlılık ekleme (DI) ile derlenir. Hizmetlerin (veritabanı bağlamı EF Core gibi) uygulama başlatma sırasında DI'ye kaydedilmesi gerekir. Bu hizmetleri gerektiren bileşenler (Sayfalar gibi Razor ) oluşturucu parametreleri aracılığıyla sağlanır. Veritabanı bağlam örneğini alan oluşturucu kodu öğreticinin ilerleyen bölümlerinde gösterilir. Bu bölümde, veritabanı bağlamını DI kapsayıcısıyla kaydedersiniz.

öğesinin en üstüne Startup.csaşağıdaki using deyimleri ekleyin:

using MvcMovie.Data;
using Microsoft.EntityFrameworkCore;

Startup.ConfigureServices içinde aşağıdaki vurgulanan kodu ekleyin:

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

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

bağlantı dizesi adı, nesne üzerinde bir yöntem DbContextOptions çağrılarak bağlama geçirilir. Yerel geliştirme için ASP.NET Core yapılandırma sistemi dosyadan appsettings.json bağlantı dizesi okur.

Veritabanı bağlantı dizesi inceleme

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

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

Derleyici hatalarını denetlemek için projeyi derleyin.

yapı iskelesi film sayfaları

Film modeli için Oluşturma, Okuma, Güncelleştirme ve Silme (CRUD) sayfaları oluşturmak için iskele aracını kullanın.

Çözüm Gezgini'da Denetleyiciler klasörüne> Yeni İskeleli Öğe Ekle'ye > sağ tıklayın.

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

yapı iskelesi ekle iletişim kutusunda, Entity Framework > Ekle'yi kullanarak görünümlere sahip MVC Denetleyicisi'ni seçin.

yapı iskelesi ekle iletişim kutusu

Denetleyici Ekle iletişim kutusunu tamamlayın:

  • Model sınıfı: Movie (MvcMovie.Models)
  • Veri bağlam sınıfı: MvcMovieContext (MvcMovie.Data)

Veri bağlamı ekleme

  • Görünümler: Her seçeneğin varsayılanını işaretli tutun
  • Denetleyici adı: Varsayılan MoviesController'i koruma
  • Ekle'yi seçin

Visual Studio şu öğeleri 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')

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

Veritabanı mevcut olmadığından, yapı iskelesi oluşturulmuş sayfaları henüz kullanamazsınız. Uygulamayı çalıştırır ve Film Uygulaması bağlantısına tıklarsanız Veritabanı açılamıyor veya böyle bir tablo yok: Film hata iletisi alırsınız.

İlk geçiş

EF CoreVeritabanını oluşturmak için Geçişler özelliğini kullanın. Geçişler, veri modelinizle eşleşecek şekilde 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) öğesini seçin.

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

Add-Migration InitialCreate
Update-Database
  • Add-Migration InitialCreate: Bir Migrations/{timestamp}_InitialCreate.cs geçiş dosyası oluşturur. InitialCreate Bağımsız değişken, geçiş adıdır. Herhangi bir ad kullanılabilir, ancak kural gereği 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 MvcMovieContext modeli temel alır.

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

    Veritabanı güncelleştirme komutu aşağıdaki uyarıyı oluşturur:

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

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

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

InitialCreate sınıfı

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

yöntemi Movie Up tablosunu oluşturur ve birincil anahtar olarak yapılandırır Id . yöntemi, Down geçiş tarafından yapılan şema değişikliklerini geri döndürü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.

Büyük olasılıkla geçiş adımını kaçırdınız.

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

    Not

    Alana ondalık virgül Price giremeyebilirsiniz. Ondalık ayırıcı ve ABD İngilizcesi olmayan tarih biçimleri için virgül (",") kullanan İngilizce olmayan yerel ayarlar için jQuery doğrulamasını desteklemek için uygulamanın genelleştirilmesi gerekir. Genelleştirme yönergeleri için bu GitHub sorununa bakın.

  • Düzenle, Ayrıntılar ve Sil 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ı (MvcMovieContext) denetleyiciye eklemek için Bağımlılık Ekleme'yi kullanır. Veritabanı bağlamı, denetleyicideki CRUD yöntemlerinin her birinde kullanılır.

Kesin türemiş modeller ve @model anahtar sözcüğü

Bu öğreticinin önceki bölümlerinde, bir denetleyicinin sözlüğü kullanarak ViewData verileri veya nesneleri bir görünüme nasıl geçirebileceğini gördünüz. ViewData Sözlük, bilgileri bir görünüme geçirmek için kullanışlı bir geç bağlı yol sağlayan dinamik bir nesnedir.

MVC ayrıca, kesin olarak yazılan model nesnelerini bir görünüme geçirme olanağı sağlar. Bu kesin türemiş yaklaşım, derleme zamanı kod denetimini etkinleştirir. yapı iskelesi mekanizması, sınıf ve görünümlerle MoviesController bu yaklaşımı (kesin olarak belirlenmiş bir model geçirme) kullandı.

Details Oluşturulan yöntemi Controllers/MoviesController.cs dosyasında 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);
}

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

  • Denetleyicinin movies denetleyicisi (ilk URL kesimi).
  • eylemi details (ikinci URL kesimi).
  • 1 kimliği (son URL kesimi).

'yi id aşağıdaki gibi bir sorgu dizesiyle de geçirebilirsiniz:

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

Parametreid, kimlik değeri sağlanmıyorsa null atanabilir bir tür (int?) olarak tanımlanır.

Rota verileri veya sorgu dizesi değeriyle eşleşen film varlıklarını seçmek için 'a FirstOrDefaultAsync bir lambda ifadesi geçirilir.

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

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

return View(movie);

Dosyanın içeriğini Views/Movies/Details.cshtml 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>

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

@model MvcMovie.Models.Movie

Bu @model yönerge, denetleyicinin görünüme iletmiş olduğu filme erişim sağlar. Model Nesne kesin olarak yazılır. Örneğin, görünümde Details.cshtml kod, her film alanını DisplayNameFor DisplayFor ve HTML Yardımcılarına kesin olarak yazılan Model nesneyle geçirir. Create ve Edit yöntemleri ve görünümleri de bir Movie model nesnesi geçirir.

Film denetleyicisindeki Index.cshtml görünümü ve Index yöntemini inceleyin. Kodun yöntemini çağırdığında nasıl bir List nesne oluşturduğuna View dikkat edin. Kod, bu Movies listeyi eylem yönteminden Index 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 dosyanın en üstüne aşağıdaki @model deyimini dahil etti Index.cshtml :

@model IEnumerable<MvcMovie.Models.Movie>

yönergesi, @model kesin olarak yazılan bir Model nesne kullanarak denetleyicinin görünüme iletmiş olduğu film listesine erişmenizi sağlar. Örneğin, görünümde Index.cshtml kod, kesin olarak yazılan Model nesnenin üzerinde bir foreach deyimle filmlerde döngü 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>

Model Nesne kesin olarak yazıldığı için (nesne IEnumerable<Movie> olarak), döngüdeki her öğe olarak Movieyazılır. Bu, diğer avantajların ya da kodun derleme zamanı denetiminin alındığını gösterir.

Ek kaynaklar