Film Modeli ve Tablosuna Yeni Alan Ekleme (C#)
tarafından Rick Anderson
Not
Bu öğreticinin ASP.NET MVC 5 ve Visual Studio 2013 kullanan güncelleştirilmiş bir sürümü burada bulunabilir. Daha güvenlidir, takip etmek çok daha kolaydır ve daha fazla özellik gösterir.
Bu öğreticide, Microsoft Visual Studio'nun ücretsiz sürümü olan Microsoft Visual Web Developer 2010 Express Service Pack 1'i kullanarak ASP.NET MVC Web uygulaması oluşturmanın temelleri öğretilecektir. Başlamadan önce, aşağıda listelenen önkoşulları yüklediğinizden emin olun. Aşağıdaki bağlantıya tıklayarak bunların tümünü yükleyebilirsiniz: Web Platformu Yükleyicisi. Alternatif olarak, aşağıdaki bağlantıları kullanarak önkoşulları tek tek yükleyebilirsiniz:
- Visual Studio Web Developer Express SP1 önkoşulları
- ASP.NET MVC 3 Araçları Güncelleştirmesi
- SQL Server Compact 4.0(çalışma zamanı + araçlar desteği)
Visual Web Developer 2010 yerine Visual Studio 2010 kullanıyorsanız, şu bağlantıya tıklayarak önkoşulları yükleyin: Visual Studio 2010 önkoşulları.
C# kaynak kodu içeren bir Visual Web Developer projesi bu konuya eşlik edebilir. C# sürümünü indirin. Visual Basic'i tercih ediyorsanız, bu öğreticinin Visual Basic sürümüne geçin.
Bu bölümde model sınıflarında bazı değişiklikler yapacak ve veritabanı şemasını model değişiklikleriyle eşleşecek şekilde nasıl güncelleştirebileceğinizi öğreneceksiniz.
Film Modeline Derecelendirme Özelliği Ekleme
Var olan Movie
sınıfa yeni Rating
bir özellik ekleyerek başlayın. Movie.cs dosyasını açın ve özelliğini şu şekilde 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; }
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
public string Rating { get; set; }
}
Derleme FilmiHatalarını Ayıkla> menü komutunu kullanarak uygulamayı yeniden derleyin.
Sınıfı güncelleştirdiğinize Model
göre, yeni Rating
özelliği desteklemek için \Views\Movies\Index.cshtml ve \Views\Movies\Create.cshtml 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 bir <td>
sütun ekleyin. Güncelleştirilmiş Index.cshtml görünüm şablonunun görünümü aşağıdadır:
<table>
<tr>
<th></th>
<th>Title</th>
<th>Release Date</th>
<th>Genre</th>
<th>Price</th>
<th>Rating</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 Me", "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 formun sonuna aşağıdaki işaretlemeyi ekleyin. Bu, yeni bir film oluşturulduğunda derecelendirme belirtebilmeniz için bir metin kutusu oluşturur.
<div class="editor-label">
@Html.LabelFor(model => model.Rating)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Rating)
@Html.ValidationMessageFor(model => model.Rating)
</div>
Model ve Veritabanı Şeması Farklarını Yönetme
Şimdi uygulama kodunu yeni Rating
özelliği destekleyecek şekilde güncelleştirdiniz.
Şimdi uygulamayı çalıştırın ve /Movies URL'sine gidin. Ancak bunu yaptığınızda aşağıdaki hatayı görürsünüz:
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
.)
Varsayılan olarak, bu öğreticinin önceki bölümlerinde yaptığınız gibi bir veritabanını otomatik olarak 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şitlenip eşitlenmediğini izlemeye yardımcı olmak için veritabanına bir tablo ekler. Eşitlenmemişlerse Entity Framework bir hata oluşturur. Bu, geliştirme zamanındaki sorunları izlemeyi kolaylaştırır ve aksi takdirde çalışma zamanında yalnızca (belirsiz hatalarla) bulabilirsiniz. Eşitleme denetimi özelliği, az önce gördüğünüz hata iletisinin görüntülenmesine neden olur.
Hatayı çözmek için iki 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, modeli ve veritabanı şemasını birlikte hızlı bir şekilde geliştirmenizi sağladığından test veritabanında etkin geliştirme yaparken çok kullanışlıdır. Ancak dezavantajı, veritabanındaki mevcut verileri kaybetmenizdir; bu nedenle bu yaklaşımı üretim veritabanında kullanmak istemezsiniz !
- Var olan veritabanının şemasını model sınıflarını eşleştirebilecek şekilde 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.
Bu öğreticide ilk yaklaşımı kullanacağız. Model değiştiğinde Entity Framework Code First veritabanını otomatik olarak yeniden oluşturacaksınız.
Model Değişikliklerinde Veritabanını Otomatik olarak Re-Creating
Uygulama modelini her değiştirdiğinizde Code First'ın veritabanını otomatik olarak bırakması ve yeniden oluşturması için uygulamayı güncelleştirelim.
Not
Uyarı Veritabanını otomatik olarak bırakma ve yeniden oluşturma yaklaşımını yalnızca bir geliştirme veya test veritabanı kullanırken etkinleştirmeniz ve hiçbir zaman gerçek veri içeren bir üretim veritabanında etkinleştirmeniz gerekir. Bunu bir üretim sunucusunda kullanmak veri kaybına yol açabilir.
Çözüm Gezgini'daModeller klasörüne sağ tıklayın, Ekle'yi ve ardından Sınıf'ı seçin.
Sınıfı "MovieInitializer" olarak adlandırın. sınıfını MovieInitializer
aşağıdaki kodu içerecek şekilde güncelleştirin:
using System;
using System.Collections.Generic;
using System.Data.Entity;
namespace MvcMovie.Models {
public class MovieInitializer : DropCreateDatabaseIfModelChanges<MovieDBContext> {
protected override void Seed(MovieDBContext context) {
var movies = new List<Movie> {
new Movie { Title = "When Harry Met Sally",
ReleaseDate=DateTime.Parse("1989-1-11"),
Genre="Romantic Comedy",
Rating="R",
Price=7.99M},
new Movie { Title = "Ghostbusters ",
ReleaseDate=DateTime.Parse("1984-3-13"),
Genre="Comedy",
Rating="R",
Price=8.99M},
new Movie { Title = "Ghostbusters 2",
ReleaseDate=DateTime.Parse("1986-2-23"),
Genre="Comedy",
Rating="R",
Price=9.99M},
new Movie { Title = "Rio Bravo",
ReleaseDate=DateTime.Parse("1959-4-15"),
Genre="Western",
Rating="R",
Price=3.99M},
};
movies.ForEach(d => context.Movies.Add(d));
}
}
}
sınıfı, MovieInitializer
model sınıfları değişirse model tarafından kullanılan veritabanının bırakılması ve otomatik olarak yeniden oluşturulması gerektiğini belirtir. Kod, herhangi bir oluşturulduğunda (veya yeniden oluşturulduğunda) veritabanına otomatik olarak eklenecek bazı varsayılan verileri belirtmek için bir Seed
yöntem içerir. Bu, her model değişikliği yaptığınızda veritabanını el ile doldurmanıza gerek kalmadan bazı örnek verilerle doldurmak için kullanışlı bir yol sağlar.
Sınıfı tanımladığınıza MovieInitializer
göre, uygulamayı her çalıştırdığında model sınıflarının veritabanındaki şemadan farklı olup olmadığını denetlemesi için bağlamanız gerekir. Bu durumda başlatıcıyı çalıştırarak modelle eşleşecek şekilde veritabanını yeniden oluşturabilir ve ardından veritabanını örnek verilerle doldurabilirsiniz.
Projenin kökündeki MvcMovies
Global.asax dosyasını açın:
Global.asax dosyası, projenin tüm uygulamasını tanımlayan sınıfını içerir ve uygulama ilk başlatıldığında çalışan bir Application_Start
olay işleyicisi içerir.
Şimdi dosyanın en üstüne iki using deyimi ekleyelim. birincisi Entity Framework ad alanına, ikincisi ise sınıfımızın MovieInitializer
yaşadığı ad alanına başvurur:
using System.Data.Entity; // Database.SetInitialize
using MvcMovie.Models; // MovieInitializer
Ardından aşağıda gösterildiği gibi yöntemini bulun Application_Start
ve yönteminin başına bir çağrı Database.SetInitializer
ekleyin:
protected void Application_Start()
{
Database.SetInitializer<MovieDBContext>(new MovieInitializer());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
Database.SetInitializer
Yeni eklediğiniz deyim, şema ve veritabanı eşleşmiyorsa örnek tarafından MovieDBContext
kullanılan veritabanının otomatik olarak silinmesi ve yeniden oluşturulması gerektiğini belirtir. Gördüğünüz gibi, veritabanını sınıfında belirtilen MovieInitializer
örnek verilerle de doldurur.
Global.asax dosyasını kapatın.
Uygulamayı yeniden çalıştırın ve /Filmler URL'sine gidin. Uygulama başlatıldığında, model yapısının artık veritabanı şemasıyla eşleşmediğini algılar. Veritabanını yeni model yapısıyla eşleşecek şekilde otomatik olarak yeniden oluşturur ve veritabanını örnek filmlerle doldurur:
Yeni 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:
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 veritabanını örnek verilerle doldurmanın bir yolunu da öğrendiniz. Ş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.