Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
tarafından Rick Anderson
Not
Visual Studio'nun en son sürümü kullanılarak bu öğreticinin güncelleştirilmiş bir sürümü burada kullanılabilir. Yeni öğreticide, bu öğretici üzerinde birçok geliştirme sağlayan ASP.NET Core MVC ağlanmaktadır.
Bu öğreticide ASP.NET Core MVC'ye denetleyiciler ve görünümler öğretildi. Razor Pages, web kullanıcı arabirimi oluşturmayı kolaylaştıran ve daha üretken hale getiren sayfa tabanlı bir programlama modeli olan ASP.NET Core'daki yeni bir alternatiftir. Razor Pages öğreticisini MVC sürümünden önce denemenizi öneririz. Razor Pages öğreticisi:
- Takip etmek daha kolaydır.
- Daha fazla özelliği kapsar.
- Yeni uygulama geliştirme için tercih edilen yaklaşımdır.
Bu bölümde, değişiklik veritabanına uygulanabilmesi için model sınıflarına bazı değişiklikleri geçirmek için Entity Framework Code First Migrations kullanacaksınız.
Varsayılan olarak, bu öğreticinin önceki bölümlerinde yaptığınız gibi otomatik olarak veritabanı oluşturmak için Entity Framework Code First kullandığınızda Code First, veritabanının şemasının oluşturulduğu model sınıflarıyla eşitlenmiş olup olmadığını izlemeye yardımcı olmak için veritabanına bir tablo ekler. Eşitlenmemişlerse Entity Framework bir hata oluşturur. Bu, geliştirme zamanında yalnızca çalışma zamanında bulabileceğiniz (belirsiz hatalarla) sorunları izlemeyi kolaylaştırır.
Model Değişiklikleri için Kod İlk Geçişlerini Ayarlama
Çözüm Gezgini'a gidin. film veritabanını kaldırmak için Movies.mdf dosyasına sağ tıklayın ve Sil'i seçin. Movies.mdf dosyasını görmüyorsanız, aşağıda kırmızı anahatta gösterilen Tüm Dosyaları Göster simgesine tıklayın.
Hata olmadığından emin olmak için uygulamayı derleyin.
Araçlar menüsünden NuGet Paket Yöneticisi’ne ve ardından Paket Yöneticisi Konsolu’na tıklayın.
komut istemindeki Paket Yöneticisi Konsolu penceresine PM>
Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext
Geçişleri Etkinleştir komutu (yukarıda gösterilmiştir) yeni bir Migrations klasöründe Configuration.cs dosyası oluşturur.
Visual Studio Configuration.cs dosyasını açar. Seed
Configuration.cs dosyasındaki yöntemini aşağıdaki kodla değiştirin:
protected override void Seed(MvcMovie.Models.MovieDBContext context)
{
context.Movies.AddOrUpdate( i => i.Title,
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
}
altındaki Movie
kırmızı dalgalı çizginin üzerine gelin ve MvcMovie.Models kullanarak öğesine tıklayın Show Potential Fixes
;
Bunu yaptığınızda aşağıdaki using deyimi eklenir:
using MvcMovie.Models;
Not
Code First Migrations, her geçiş sonrasında Seed
yöntemini çağırır (başka bir ifadeyle Paket Yöneticisi Konsolunda update-database çağrılır) ve bu yöntem zaten eklenmiş olan satırları güncelleştirir veya henüz yoksa bunları ekler.
Aşağıdaki koddaki AddOrUpdate yöntemi bir "upsert" işlemi gerçekleştirir:
context.Movies.AddOrUpdate(i => i.Title,
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "PG",
Price = 7.99M
}
Seed yöntemi her geçişle çalıştığından, eklemeye çalıştığınız satırlar veritabanını oluşturan ilk geçiş sonrasında zaten orada olacağı için veri ekleyemezsiniz. "upsert" işlemi, zaten var olan bir satır eklemeye çalıştığınızda oluşabilecek hataları önler, ancak uygulamayı test ederken yapmış olabileceğiniz verilerde yaptığınız değişiklikleri geçersiz kılar. Bazı tablolardaki test verileriyle bunun olmasını istemeyebilirsiniz: Bazı durumlarda test sırasında verileri değiştirdiğinizde, veritabanı güncelleştirmeleri sonrasında değişikliklerinizin kalmasını istersiniz. Bu durumda, koşullu ekleme işlemi yapmak istiyorsunuz: yalnızca henüz yoksa bir satır ekleyin.
AddOrUpdate yöntemine geçirilen ilk parametre, bir satırın zaten var olup olmadığını denetlemek için kullanılacak özelliği belirtir. Sağladığınız test filmi verileri için, Title
listedeki her başlık benzersiz olduğundan özellik bu amaçla kullanılabilir:
context.Movies.AddOrUpdate(i => i.Title,
Bu kod başlıkların benzersiz olduğunu varsayar. El ile yinelenen bir başlık eklerseniz, bir sonraki geçiş işleminizi gerçekleştirdiğinizde aşağıdaki özel durumla karşınıza çıkar.
Sıra birden fazla öğe içeriyor
AddOrUpdate yöntemi hakkında daha fazla bilgi için bkz. EF 4.3 AddOrUpdate Yöntemi ile ilgilenme..
Projeyi oluşturmak için CTRL-SHIFT-B tuşlarına basın.(Bu noktada derlemezseniz aşağıdaki adımlar başarısız olur.)
Sonraki adım, ilk geçiş için bir DbMigration
sınıf oluşturmaktır. Bu geçiş yeni bir veritabanı oluşturur, bu nedenle önceki bir adımda movie.mdf dosyasını silebilirsiniz.
Paket Yöneticisi Konsolu penceresinde, ilk geçişi oluşturmak için komutunu add-migration Initial
girin. "Initial" adı rastgeledir ve oluşturulan geçiş dosyasını adlandırmak için kullanılır.
Code First Migrations, Migrations klasöründe ({DateStamp}_Initial.cs) başka bir sınıf dosyası oluşturur ve bu sınıf veritabanı şemasını oluşturan kodu içerir. Geçiş dosya adı, sıralamaya yardımcı olmak için bir zaman damgasıyla önceden düzeltildi. {DateStamp}_Initial.cs dosyasını inceleyin; Film Veritabanı için tablo oluşturma Movies
yönergelerini içerir. Aşağıdaki yönergelerde veritabanını güncelleştirdiğinizde, bu {DateStamp}_Initial.cs dosyası çalışır ve VERITABANı şemasını oluşturur. Ardından Seed yöntemi çalıştırarak veritabanını test verileriyle doldurur.
Paket Yöneticisi Konsolu'nda veritabanını oluşturmak ve yöntemini çalıştırmak Seed
için komutunu update-database
girin.
Bir tablonun zaten var olduğunu ve oluşturulamadığını belirten bir hata alırsanız, bunun nedeni büyük olasılıkla veritabanını sildikten sonra ve yürütmeden update-database
önce uygulamayı çalıştırmanızdır. Bu durumda, Movies.mdf dosyasını yeniden silin ve komutu yeniden deneyinupdate-database
. Hata almaya devam ederseniz, geçişler klasörünü ve içeriğini silin ve ardından bu sayfanın üst kısmındaki yönergelerle başlayın (Movies.mdf dosyasını silin ve ardından Enable-Migrations'a geçin). Hata almaya devam ederseniz SQL Server Nesne Gezgini açın ve veritabanını listeden kaldırın. "Dosya .mdf veritabanı olarak eklenemiyor" hatasını alırsanız web.config dosyasındaki bağlantı dizesi bir parçası olarak İlk Katalog özelliğini kaldırın.
Uygulamayı çalıştırın ve /Filmler URL'sine gidin. Tohum verileri görüntülenir.
Film Modeline Derecelendirme Özelliği Ekleme
Mevcut Movie
sınıfa yeni Rating
bir özellik ekleyerek başlayın. Models\Movie.cs dosyasını açın ve aşağıdakine benzer bir özellik ekleyinRating
:
public string Rating { get; set; }
Sınıfın tamamı Movie
artık aşağıdaki koda benzer:
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
[Display(Name = "Release Date")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
public string Rating { get; set; }
}
Uygulamayı derleyin (Ctrl+Shift+B).
Sınıfına yeni bir alan eklediğinizden, bu yeni özelliğin Movie
dahil edilmesi için bağlama izin verilenler listesini de güncelleştirmeniz gerekir. ve eylem yöntemlerinin bind
özniteliğini Create
özelliğini içerecek şekilde güncelleştirinRating
:Edit
[Bind(Include = "ID,Title,ReleaseDate,Genre,Price,Rating")]
Tarayıcı görünümünde yeni Rating
özelliği görüntülemek, oluşturmak ve düzenlemek için görünüm şablonlarını da güncelleştirmeniz gerekir.
\Views\Movies\Index.cshtml dosyasını açın ve Price sütununun hemen arkasına bir <th>Rating</th>
sütun başlığı ekleyin. Ardından, değeri işlemek @item.Rating
için şablonun sonuna yakın bir <td>
sütun ekleyin. Güncelleştirilmiş Index.cshtml görünüm şablonu aşağıdaki gibidir:
@model IEnumerable<MvcMovie.Models.Movie>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
@using (Html.BeginForm("Index", "Movies", FormMethod.Get))
{
<p>
Genre: @Html.DropDownList("movieGenre", "All")
Title: @Html.TextBox("SearchString")
<input type="submit" value="Filter" />
</p>
}
</p>
<table class="table">
<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>
@Html.DisplayNameFor(model => model.Rating)
</th>
<th></th>
</tr>
@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>
@Html.DisplayFor(modelItem => item.Rating)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
@Html.ActionLink("Details", "Details", new { id=item.ID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.ID })
</td>
</tr>
}
</table>
Ardından \ Views\Movies\Create.cshtml dosyasını açın ve aşağıdaki vurgulanmış işaretlemeyi Rating
içeren alanı ekleyin. Bu, yeni bir film oluşturulduğunda derecelendirme belirtebilmeniz için bir metin kutusu oluşturur.
<div class="form-group">
@Html.LabelFor(model => model.Price, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Price, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Price, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Rating, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Rating, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Rating, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
Şimdi uygulama kodunu yeni Rating
özelliği destekleyecek şekilde güncelleştirdiniz.
Uygulamayı çalıştırın ve /Filmler URL'sine gidin. Ancak bunu yaptığınızda aşağıdaki hatalardan birini görürsünüz:
Veritabanı oluşturulduktan sonra 'MovieDBContext' bağlamını arkalayan model değişti. Veritabanını (https://go.microsoft.com/fwlink/?LinkId=238269) güncelleştirmek için Code First Migrations kullanmayı göz önünde bulundurun.
Uygulamadaki güncelleştirilmiş Movie
model sınıfı artık mevcut veritabanının tablosunun Movie
şemasından farklı olduğundan bu hatayı görüyorsunuz. (Veritabanı tablosunda sütun yok Rating
.)
Hatayı çözmek için birkaç yaklaşım vardır:
- Entity Framework'ün veritabanını yeni model sınıfı şemasına göre otomatik olarak bırakmasını ve yeniden oluşturmasını sağlayın. Bu yaklaşım, bir test veritabanında etkin geliştirme yaparken geliştirme döngüsünün erken dönemlerinde çok kullanışlıdır; model ve veritabanı şemasını birlikte hızla geliştirmenizi sağlar. Ancak bunun dezavantajı, veritabanındaki mevcut verileri kaybetmenizdir; bu nedenle bu yaklaşımı bir üretim veritabanında kullanmak istemezsiniz! Test verileriyle veritabanını otomatik olarak görmek için başlatıcı kullanmak genellikle uygulama geliştirmenin üretken bir yoludur. Entity Framework veritabanı başlatıcıları hakkında daha fazla bilgi için bkz . ASP.NET MVC/Entity Framework öğreticisi.
- Var olan veritabanının şemasını model sınıflarının eşleşmesi için açıkça değiştirin. Bu yaklaşımın avantajı, verilerinizi saklamanızdır. Bu değişikliği el ile veya veritabanı değişiklik betiği oluşturarak yapabilirsiniz.
- Veritabanı şemasını güncelleştirmek için Code First Migrations'ı kullanın.
Bu öğreticide Code First Migrations'ı kullanacağız.
Seed yöntemini yeni sütun için bir değer sağlayacak şekilde güncelleştirin. Migrations\Configuration.cs dosyasını açın ve her Movie nesnesine bir Derecelendirme alanı ekleyin.
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "PG",
Price = 7.99M
},
Çözümü derleyin ve Paket Yöneticisi Konsolu penceresini açın ve aşağıdaki komutu girin:
add-migration Rating
komutu, add-migration
geçiş çerçevesine geçerli film modelini geçerli film veritabanı şemasıyla incelemesini ve veritabanını yeni modele geçirmek için gerekli kodu oluşturmasını söyler. Derecelendirme adı rastgeledir ve geçiş dosyasını adlandırmak için kullanılır. Geçiş adımı için anlamlı bir ad kullanmak yararlı olur.
Bu komut tamamlandığında, Visual Studio yeni DbMigration
türetilmiş sınıfı tanımlayan sınıf dosyasını açar ve yönteminde Up
yeni sütunu oluşturan kodu görebilirsiniz.
public partial class AddRatingMig : DbMigration
{
public override void Up()
{
AddColumn("dbo.Movies", "Rating", c => c.String());
}
public override void Down()
{
DropColumn("dbo.Movies", "Rating");
}
}
Çözümü derleyin ve Paket Yöneticisi Konsolu penceresine komutunu girinupdate-database
.
Aşağıdaki görüntüde, Paket Yöneticisi Konsolu penceresindeki çıkış gösterilmektedir (Tarih damgası ön satış derecelendirmesi farklı olacaktır.)
Uygulamayı yeniden çalıştırın ve /Movies URL'sine gidin. Yeni Derecelendirme alanını görebilirsiniz.
Yeni bir film eklemek için Yeni Oluştur bağlantısına tıklayın. Derecelendirme ekleyebileceğinizi unutmayın.
Oluştur’a tıklayın. Derecelendirme de dahil olmak üzere yeni film artık film listesinde gösterilir:
Proje artık geçişleri kullandığına göre, yeni bir alan eklediğinizde veya şemayı başka bir şekilde güncelleştirdiğinizde veritabanını bırakmanız gerekmez. Sonraki bölümde daha fazla şema değişikliği yapacak ve veritabanını güncelleştirmek için geçişleri kullanacağız.
Alanı Düzenleme, Ayrıntılar ve Sil görünüm şablonlarına da eklemeniz Rating
gerekir.
Paket Yöneticisi Konsolu penceresine "update-database" komutunu yeniden girebilirsiniz ve şema modelle eşleştiğinden hiçbir geçiş kodu çalışmaz. Ancak, "update-database" çalıştırıldığında yöntem yeniden çalıştırılır Seed
ve Seed verilerinden herhangi birini değiştirirseniz, yöntem verileri yükselttiğinden Seed
değişiklikler kaybolur. Tom Dykstra'nın popüler ASP.NET MVC/Entity Framework öğreticisinde yöntemi hakkında daha fazla bilgi Seed
edinebilirsiniz.
Bu bölümde model nesnelerini nasıl değiştirebileceğinizi ve veritabanını değişikliklerle eşitlenmiş durumda tutabileceğinizi gördünüz. Ayrıca senaryoları deneyebilmek için yeni oluşturulan bir veritabanını örnek verilerle doldurmanın bir yolunu da öğrendiniz. Bu, Code First'e hızlı bir giriş niteliğindeydi. Konuyla ilgili daha eksiksiz bir öğretici için bkz . ASP.NET MVC Uygulaması için Entity Framework Veri Modeli Oluşturma. Şimdi model sınıflarına nasıl daha zengin doğrulama mantığı ekleyebileceğinize ve bazı iş kurallarının uygulanmasını nasıl etkinleştirebileceğinize bakalım.