Bölüm 4, ASP.NET Core MVC uygulamasına model ekleme
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.
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 , , Read
Update
ve Delete
(CRUD) sayfaları oluşturmak Create
iç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.
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.
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.
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
: BirMigrations/{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 belirtilenMvcMovieContext
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önteminiMigrations/{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.cs
ile 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.cs
aş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ırId
.InitialCreate.Down
geçiş tarafından yapılan şema değişikliklerini geri döndürürUp
.
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. details
eylemi, 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 Movie
yazı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 , , Read
Update
ve Delete
(CRUD) sayfaları oluşturmak Create
iç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.
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.
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.
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
: BirMigrations/{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 belirtilenMvcMovieContext
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önteminiMigrations/{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.cs
ile 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.cs
aş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ırId
.InitialCreate.Down
geçiş tarafından yapılan şema değişikliklerini geri döndürürUp
.
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. details
eylemi, 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 Movie
yazı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 , , Read
Update
ve Delete
(CRUD) sayfaları oluşturmak Create
iç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.
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.
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.
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
: BirMigrations/{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 belirtilenMvcMovieContext
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önteminiMigrations/{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.cs
ile 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.cs
aş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ırId
.InitialCreate.Down
geçiş tarafından yapılan şema değişikliklerini geri döndürürUp
.
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. details
eylemi, 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 Movie
yazı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'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 , , Read
Update
ve Delete
(CRUD) sayfaları oluşturmak Create
iç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.
yapı iskelesi ekle iletişim kutusunda, Entity Framework > Ekle'yi kullanarak görünümlere sahip MVC Denetleyicisi'ni seçin.
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.
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
: BirMigrations/{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 belirtilenMvcMovieContext
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önteminiMigrations/{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.cs
ile 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.cs
aş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ırId
.InitialCreate.Down
geçiş tarafından yapılan şema değişikliklerini geri döndürürUp
.
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. details
eylemi, 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 Movie
yazı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'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 , , Read
Update
ve Delete
(CRUD) sayfaları oluşturmak Create
iç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.
yapı iskelesi ekle iletişim kutusunda, Entity Framework > Ekle'yi kullanarak görünümlere sahip MVC Denetleyicisi'ni seçin.
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.
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
: BirMigrations/{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 belirtilenMvcMovieContext
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önteminiMigrations/{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 Startup
DI'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.ConfigureServices
aş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ırId
.InitialCreate.Down
geçiş tarafından yapılan şema değişikliklerini geri döndürürUp
.
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. details
eylemi, 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 Movie
yazı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'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.cs
aş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.
yapı iskelesi ekle iletişim kutusunda, Entity Framework > Ekle'yi kullanarak görünümlere sahip MVC Denetleyicisi'ni seçin.
Denetleyici Ekle iletişim kutusunu tamamlayın:
- Model sınıfı: Movie (MvcMovie.Models)
- Veri bağlam sınıfı: MvcMovieContext (MvcMovie.Data)
- 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
: BirMigrations/{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 belirtilenMvcMovieContext
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önteminiMigrations/{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.
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 Movie
yazılır. Bu, diğer avantajların ya da kodun derleme zamanı denetiminin alındığını gösterir.
Ek kaynaklar
ASP.NET Core