Öğretici: ASP.NET MVC'de Entity Framework ile CRUD İşlevselliği Uygulama
Önceki öğreticide Entity Framework (EF) 6 ve SQL Server LocalDB kullanarak verileri depolayan ve görüntüleyen bir MVC uygulaması oluşturdunuz. Bu öğreticide, MVC iskelesinin denetleyicilerde ve görünümlerde sizin için otomatik olarak oluşturduğu oluşturma, okuma, güncelleştirme, silme (CRUD) kodunu gözden geçirecek ve özelleştirebilirsiniz.
Not
Denetleyicinizle veri erişim katmanı arasında bir soyutlama katmanı oluşturmak için depo düzenini uygulamak yaygın bir uygulamadır. Bu öğreticileri basit tutmak ve EF 6'nın kendisini kullanmayı öğretmeye odaklanmak için depoları kullanmaz. Depoları uygulama hakkında bilgi için bkz . ASP.NET Veri Erişimi İçerik Haritası.
Oluşturduğunuz web sayfalarının örnekleri aşağıda verilmiştir:
Bu öğreticide şunları yaptınız:
- Ayrıntılar sayfası oluşturma
- Oluştur sayfasını güncelleştirme
- HttpPost Edit yöntemini güncelleştirme
- Sil sayfasını güncelleştirme
- Veritabanı bağlantılarını kapatma
- İşlemleri işleme
Önkoşullar
Ayrıntılar sayfası oluşturma
Öğrenciler Index
sayfasının yapı iskelesi oluşturulmuş kodu özelliğin dışında Enrollments
bıraktı, çünkü bu özellik bir koleksiyon barındırıyor. Details
Sayfada, koleksiyonun içeriğini bir HTML tablosunda görüntüleyeceksiniz.
Controllers\StudentController.cs'da, görünümün Details
eylem yöntemi tek Student
bir varlığı almak için Bul yöntemini kullanır.
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Student student = db.Students.Find(id);
if (student == null)
{
return HttpNotFound();
}
return View(student);
}
Anahtar değeri parametresi olarak id
yöntemine geçirilir ve Dizin sayfasındaki Ayrıntılar köprüsündeki yol verilerinden gelir.
İpucu: Verileri yönlendirme
Yönlendirme verileri, model bağlayıcısının yönlendirme tablosunda belirtilen bir URL kesiminde bulduğu verilerdir. Örneğin, varsayılan yol , action
ve id
kesimlerini belirtircontroller
:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Aşağıdaki URL'de, varsayılan yol olarak , Index
action
ve 1 olarak id
eşlenir Instructor
controller
; bunlar rota veri değerleridir.
http://localhost:1230/Instructor/Index/1?courseID=2021
?courseID=2021
bir sorgu dizesi değeridir. Sorgu dizesi değeri olarak geçirirseniz model bağlayıcısı id
da çalışır:
http://localhost:1230/Instructor/Index?id=1&CourseID=2021
URL'ler Razor görünümündeki deyimler tarafından ActionLink
oluşturulur. Aşağıdaki kodda id
parametresi varsayılan yol ile eşleşir, bu nedenle id
yol verilerine eklenir.
@Html.ActionLink("Select", "Index", new { id = item.PersonID })
Aşağıdaki kodda, courseID
varsayılan yoldaki bir parametreyle eşleşmediğinden sorgu dizesi olarak eklenir.
@Html.ActionLink("Select", "Index", new { courseID = item.CourseID })
Ayrıntılar sayfasını oluşturmak için
Views\Student\Details.cshtml dosyasını açın.
Her alan, aşağıdaki örnekte gösterildiği gibi bir
DisplayFor
yardımcı kullanılarak görüntülenir:<dt> @Html.DisplayNameFor(model => model.LastName) </dt> <dd> @Html.DisplayFor(model => model.LastName) </dd>
Alandan
EnrollmentDate
sonra ve kapanış</dl>
etiketinden hemen önce, aşağıdaki örnekte gösterildiği gibi kayıtların listesini görüntülemek için vurgulanan kodu ekleyin:<dt> @Html.DisplayNameFor(model => model.EnrollmentDate) </dt> <dd> @Html.DisplayFor(model => model.EnrollmentDate) </dd> <dt> @Html.DisplayNameFor(model => model.Enrollments) </dt> <dd> <table class="table"> <tr> <th>Course Title</th> <th>Grade</th> </tr> @foreach (var item in Model.Enrollments) { <tr> <td> @Html.DisplayFor(modelItem => item.Course.Title) </td> <td> @Html.DisplayFor(modelItem => item.Grade) </td> </tr> } </table> </dd> </dl> </div> <p> @Html.ActionLink("Edit", "Edit", new { id = Model.ID }) | @Html.ActionLink("Back to List", "Index") </p>
Kodu yapıştırdıktan sonra kod girintisi yanlışsa, biçimlendirmek için Ctrl+K, Ctrl+D tuşlarına basın.
Bu kod, gezinti özelliğindeki
Enrollments
varlıklar arasında döngü oluşturur. Özelliğindeki herEnrollment
varlık için kurs başlığını ve notu görüntüler. Kurs başlığı, varlığınCourse
gezinti özelliğindeCourse
depolanan varlıktanEnrollments
alınır. Bu verilerin tümü gerektiğinde veritabanından otomatik olarak alınır. Başka bir deyişle, burada yavaş yükleme kullanıyorsunuz. Gezinti özelliği için istekli yükleme belirtmediğiniz içinCourses
kayıtlar, öğrencileri alan sorguda alınmadı. Bunun yerine, gezinti özelliğine ilk kez erişmeyeEnrollments
çalıştığınızda, verileri almak için veritabanına yeni bir sorgu gönderilir. Gecikmeli yükleme ve hevesle yükleme hakkında daha fazla bilgiyi bu serinin devamında yer alan İlgili Verileri Okuma öğreticisinde bulabilirsiniz.Programı başlatarak (Ctrl+F5), Öğrenciler sekmesini seçip Alexander Carson için Ayrıntılar bağlantısına tıklayarak Ayrıntılar sayfasını açın. (Eğer Details.cshtml dosyası açıkken Ctrl+F5, BIR HTTP 400 hatası alırsınız. Bunun nedeni Visual Studio'nun Ayrıntılar sayfasını çalıştırmayı denemesi, ancak görüntülenecek öğrenciyi belirten bir bağlantıdan ulaşılamadığıdır. Böyle bir durumda URL'den "Öğrenci/Ayrıntılar"ı kaldırın ve yeniden deneyin veya tarayıcıyı kapatın, projeye sağ tıklayın ve Tarayıcıda Görünümü Görüntüle'ye>tıklayın.)
Seçilen öğrencinin ders ve not listesini görürsünüz.
Tarayıcıyı kapatın.
Oluştur sayfasını güncelleştirme
Controllers\StudentController.cs içinde eylem yöntemini aşağıdaki kodla değiştirin HttpPostAttribute
Create
. Bu kod birtry-catch
blok ekler ve yapı iskelesi yöntemi için özniteliğinden BindAttribute kaldırırID
:[HttpPost] [ValidateAntiForgeryToken] public ActionResult Create([Bind(Include = "LastName, FirstMidName, EnrollmentDate")]Student student) { try { if (ModelState.IsValid) { db.Students.Add(student); db.SaveChanges(); return RedirectToAction("Index"); } } catch (DataException /* dex */) { //Log the error (uncomment dex variable name and add a line here to write a log. ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists see your system administrator."); } return View(student); }
Bu kod, ASP.NET MVC model bağlayıcısı tarafından oluşturulan varlığı varlık kümesine
Students
eklerStudent
ve sonra değişiklikleri veritabanına kaydeder. Model bağlayıcısı , form tarafından gönderilen verilerle çalışmanızı kolaylaştıran ASP.NET MVC işlevselliğini ifade eder; model bağlayıcısı, gönderilen form değerlerini CLR türlerine dönüştürür ve bunları parametrelerdeki eylem yöntemine geçirir. Bu durumda model bağlayıcısı, koleksiyondaki özellik değerlerini kullanarak sizin için birStudent
varlığın örneğiniForm
oluşturur.Sql Server'ın satır eklendiğinde otomatik olarak ayarlanacağı birincil anahtar değeri olduğundan
ID
Bind özniteliğinden kaldırmıştınızID
. Kullanıcıdan gelen giriş değeri ayarlamazID
.Güvenlik uyarısı - Özniteliği siteler
ValidateAntiForgeryToken
arası istek sahteciliği saldırılarını önlemeye yardımcı olur. Görünümde daha sonra göreceğiniz karşılık gelenHtml.AntiForgeryToken()
bir deyim gerektirir.Bind
özniteliği, oluşturma senaryolarında aşırı göndermeye karşı korumanın bir yoludur. Örneğin, varlığınStudent
bu web sayfasının ayarlamasını istemediğiniz birSecret
özellik içerdiğini varsayalım.public class Student { public int ID { get; set; } public string LastName { get; set; } public string FirstMidName { get; set; } public DateTime EnrollmentDate { get; set; } public string Secret { get; set; } public virtual ICollection<Enrollment> Enrollments { get; set; } }
Web sayfasında bir
Secret
alanınız olmasa bile, bir bilgisayar korsanı form değeri göndermekSecret
için fiddler gibi bir araç kullanabilir veya javascript yazabilir. BindAttribute Öznitelik, model bağlayıcısının birStudent
örnek oluştururken kullandığı alanları sınırlamadan, model bağlayıcısı buSecret
form değerini alır ve varlık örneğini oluşturmakStudent
için kullanır. Ardından, hacker'ın form alanı içinSecret
belirttiği değer veritabanınızda güncelleştirilir. Aşağıdaki görüntüde, fiddler aracının gönderilen form değerlerineSecret
alanını ("OverPost" değeriyle) eklemesi gösterilmektedir."OverPost" değeri daha sonra eklenen satırın
Secret
özelliğine başarıyla eklenir, ancak web sayfasının bu özelliği ayarlayabilmesini hiç amaçlamadıysanız.Alanları açıkça listelemek için parametresini
Bind
özniteliğiyle kullanmakInclude
en iyisidir. Dışlamak istediğiniz alanları engellemek için parametresiniExclude
de kullanabilirsiniz. Bunun daha güvenli olmasının nedeniInclude
, varlığa yeni bir özellik eklediğinizde yeni alanın bir liste tarafındanExclude
otomatik olarak korunmamasıdır.Düzenleme senaryolarında, varlığı önce veritabanından okuyup sonra çağrısı
TryUpdateModel
yaparak açıkça izin verilen özellikler listesini geçirerek fazla paylaşım yapılmasını önleyebilirsiniz. Bu, bu öğreticilerde kullanılan yöntemdir.Birçok geliştirici tarafından tercih edilen fazla göndermeyi önlemenin alternatif bir yolu, model bağlamalı varlık sınıfları yerine görünüm modellerini kullanmaktır. Görünüm modeline yalnızca güncelleştirmek istediğiniz özellikleri ekleyin. MVC model bağlayıcısı tamamlandıktan sonra, isteğe bağlı olarak AutoMapper gibi bir araç kullanarak görünüm modeli özelliklerini varlık örneğine kopyalayın. Db kullanın. Durumunu Değişmedi olarak ayarlamak için varlık örneğindeki girdi ve ardından Property("PropertyName") değerini ayarlayın. Görünüm modeline dahil edilen her varlık özelliğinde IsModified to true. Bu yöntem hem düzenleme hem de oluşturma senaryolarında çalışır.
Özniteliği dışında
Bind
,try-catch
yapı iskelesi oluşturulmuş kodda yaptığınız tek değişiklik bloğudur. Değişiklikleri kaydedilirken türetilen DataException bir özel durum yakalanırsa, genel bir hata iletisi görüntülenir. DataException özel durumlar bazen programlama hatası yerine uygulamanın dışındaki bir şeyden kaynaklanır, bu nedenle kullanıcının yeniden denemesi tavsiye edilir. Bu örnekte uygulanmasa da, bir üretim kalitesi uygulaması özel durumu günlüğe kaydeder. Daha fazla bilgi için İzleme ve Telemetri (Azure ile Gerçek Dünya Bulut Uygulamaları Oluşturma) bölümündeki İçgörü günlüğü bölümüne bakın.Views\Student\Create.cshtml içindeki kod Details.cshtml dosyasında gördüklerinize benzer, ancak
EditorFor
veValidationMessageFor
yardımcıları yerine her alanDisplayFor
için kullanılır. İlgili kod şu şekildedir:<div class="form-group"> @Html.LabelFor(model => model.LastName, new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.LastName) @Html.ValidationMessageFor(model => model.LastName) </div> </div>
Create.cshtml ayrıca, siteler arası istek sahteciliği saldırılarını önlemeye yardımcı olmak için denetleyicideki özniteliğiyle
ValidateAntiForgeryToken
birlikte çalışan öğesini de içerir@Html.AntiForgeryToken()
.Create.cshtml dosyasında değişiklik yapılması gerekmez.
Programı başlatıp Öğrenciler sekmesini seçip Yeni Oluştur'a tıklayarak sayfayı çalıştırın.
Adları ve geçersiz bir tarihi girin ve hata iletisini görmek için Oluştur'a tıklayın.
Bu, varsayılan olarak elde ettiğiniz sunucu tarafı doğrulamadır. Sonraki bir öğreticide, istemci tarafı doğrulama için kod oluşturan özniteliklerin nasıl ekleneceğini göreceksiniz. Aşağıdaki vurgulanmış kod, Create yöntemindeki model doğrulama denetimini gösterir.
if (ModelState.IsValid) { db.Students.Add(student); db.SaveChanges(); return RedirectToAction("Index"); }
Tarihi geçerli bir değerle değiştirin ve Yeni öğrencinin Dizin sayfasında görünmesi için Oluştur'a tıklayın.
Tarayıcıyı kapatın.
HttpPost Edit yöntemini güncelleştirme
HttpPostAttribute
Edit
eylem yöntemini aşağıdaki kodla değiştirin:[HttpPost, ActionName("Edit")] [ValidateAntiForgeryToken] public ActionResult EditPost(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } var studentToUpdate = db.Students.Find(id); if (TryUpdateModel(studentToUpdate, "", new string[] { "LastName", "FirstMidName", "EnrollmentDate" })) { try { db.SaveChanges(); return RedirectToAction("Index"); } catch (DataException /* dex */) { //Log the error (uncomment dex variable name and add a line here to write a log. ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator."); } } return View(studentToUpdate); }
Not
Controllers\StudentController.cs içinde
HttpGet Edit
yöntemi (özniteliği olmayanHttpPost
) yönteminde gördüğünüzDetails
gibi seçiliStudent
varlığı almak için yöntemini kullanırFind
. Bu yöntemi değiştirmeniz gerekmez.Bu değişiklikler, üst paylaşım önlemeye yönelik bir güvenlik en iyi uygulamasını uygular, yapı iskelesi bir
Bind
öznitelik oluşturur ve model bağlayıcısı tarafından oluşturulan varlığı Değiştirilmiş bayrağıyla varlık kümesine ekler. Öznitelik, parametresinde listelenmeyenBind
Include
alanlardaki önceden var olan verileri temizlediğinden bu kod artık önerilmez. Gelecekte MVC denetleyicisi iskelesi, Edit yöntemleri için öznitelikler oluşturmayacakBind
şekilde güncelleştirilecektir.Yeni kod mevcut varlığı okur ve gönderilen form verilerindeki kullanıcı girişinden alanları güncelleştirmeye çağırır TryUpdateModel . Entity Framework'ün otomatik değişiklik izlemesi varlıkta EntityState.Modified bayrağını ayarlar. SaveChanges yöntemi çağrıldığında, Modified bayrağı Entity Framework'ün veritabanı satırını güncelleştirmek için SQL deyimleri oluşturmasına neden olur. Eşzamanlılık çakışmaları yoksayılır ve kullanıcının değiştirmemiş olduğu sütunlar da dahil olmak üzere veritabanı satırının tüm sütunları güncelleştirilir. (Sonraki bir öğreticide eşzamanlılık çakışmalarının nasıl işleneceği gösterilir ve veritabanında yalnızca tek tek alanların güncelleştirilmesini istiyorsanız varlığı EntityState.Unchanged ve tek tek alanları EntityState.Modified olarak ayarlayın.)
Fazla göndermeyi önlemek için, Düzenle sayfası tarafından güncelleştirilebilir olmasını istediğiniz alanlar parametrelerde
TryUpdateModel
listelenir. Şu anda koruduğun ek alan yok, ancak model bağlayıcısının bağlamasını istediğiniz alanları listelemek, gelecekte veri modeline alanlar eklerseniz, bunları buraya açıkça ekleyene kadar bunların otomatik olarak korunmasını sağlar.Bu değişikliklerin sonucunda, HttpPost Edit yönteminin yöntem imzası HttpGet düzenleme yöntemiyle aynıdır; bu nedenle EditPost yöntemini yeniden adlandırdığınıza göre.
İpucu
Varlık Durumları ve Ekleme ve SaveChanges Yöntemleri
Veritabanı bağlamı, bellekteki varlıkların veritabanında karşılık gelen satırlarıyla eşitlenip eşitlenmediğini izler ve bu bilgiler yöntemi çağırdığınızda
SaveChanges
ne olacağını belirler. Örneğin, Add yöntemine yeni bir varlık geçirdiğinizde, bu varlığın durumu olarakAdded
ayarlanır. Ardından SaveChanges yöntemini çağırdığınızda, veritabanı bağlamı bir SQLINSERT
komutu döndürür.Bir varlık aşağıdaki durumlardan birinde olabilir:
Added
. Varlık henüz veritabanında yok. yöntemininSaveChanges
birINSERT
deyim vermesi gerekir.Unchanged
. yöntemiyle bu varlıklaSaveChanges
hiçbir şey yapılmasına gerek yoktur. Veritabanından bir varlığı okuduğunuzda varlık bu durumla başlar.Modified
. Varlığın özellik değerlerinin bazıları veya tümü değiştirildi. yöntemininSaveChanges
birUPDATE
deyim vermesi gerekir.Deleted
. Varlık silinmek üzere işaretlendi. yöntemininSaveChanges
birDELETE
deyimi vermesi gerekir.Detached
. Varlık veritabanı bağlamı tarafından izlenmiyor.
Masaüstü uygulamasında durum değişiklikleri genellikle otomatik olarak ayarlanır. Masaüstü uygulama türünde bir varlığı okur ve bazı özellik değerlerinde değişiklik yaparsınız. Bu, varlık durumunun otomatik olarak olarak olarak değiştirilmesine
Modified
neden olur. Ardından çağırdığınızdaSaveChanges
, Entity Framework yalnızca değiştirdiğiniz gerçek özellikleri güncelleştiren bir SQLUPDATE
deyimi oluşturur.Web uygulamalarının bağlantısız yapısı bu sürekli diziye izin vermez. Bir varlığı okuyan DbContext , bir sayfa işlendikten sonra atılır.
HttpPost
Edit
Eylem yöntemi çağrıldığında yeni bir istek yapılır ve DbContext'in yeni bir örneğine sahip olursunuz, bu nedenle çağırdığınızdaSaveChanges
varlık durumunuModified.
El ile Sonra olarak ayarlamanız gerekir; bağlam hangi özellikleri değiştirdiğiniz konusunda hiçbir yol olmadığından Entity Framework veritabanı satırının tüm sütunlarını güncelleştirir.SQL
Update
deyiminin yalnızca kullanıcının gerçekten değiştirdiği alanları güncelleştirmesini istiyorsanız, yöntem çağrıldığındaHttpPost
Edit
kullanılabilir olmaları için özgün değerleri bir şekilde (gizli alanlar gibi) kaydedebilirsiniz. Ardından özgün değerleri kullanarak birStudent
varlık oluşturabilir, varlığın özgün sürümüyle yöntemini çağırabilirAttach
, varlığın değerlerini yeni değerlerle güncelleştirebilir ve daha fazlaSaveChanges.
bilgi için bkz . Varlık durumları ve SaveChanges ve Yerel Veriler.Views\Student\Edit.cshtml içindeki HTML ve Razor kodu, Create.cshtml dosyasında gördüklerinize benzer ve hiçbir değişiklik gerekmez.
Programı başlatıp Öğrenciler sekmesini seçip bir Köprüyü düzenle'ye tıklayarak sayfayı çalıştırın.
Bazı verileri değiştirin ve Kaydet'e tıklayın. Değiştirilen verileri Dizin sayfasında görürsünüz.
Tarayıcıyı kapatın.
Sil sayfasını güncelleştirme
Controllers\StudentController.cs'da yöntemin Delete
HttpGetAttribute şablon kodu, ve Edit
yöntemlerinde Details
gördüğünüz gibi seçili Student
varlığı almak için yöntemini kullanırFind
. Ancak çağrısı başarısız olduğunda özel bir hata iletisi uygulamak için SaveChanges
bu yönteme ve ilgili görünümüne bazı işlevler ekleyeceksiniz.
Güncelleştirme ve oluşturma işlemlerini gördüğünüz gibi silme işlemleri için iki eylem yöntemi gerekir. GET isteğine yanıt olarak çağrılan yöntem, kullanıcıya silme işlemini onaylama veya iptal etme şansı veren bir görünüm görüntüler. Kullanıcı onaylarsa bir POST isteği oluşturulur. Bu durumda yöntemi HttpPost
Delete
çağrılır ve ardından bu yöntem silme işlemini gerçekleştirir.
Veritabanı güncelleştirildiğinde oluşabilecek hataları işlemek için yöntemine bir try-catch
blok HttpPostAttribute Delete
ekleyeceksiniz. Bir hata oluşursa, HttpPostAttribute Delete
yöntemi yöntemini çağırır HttpGetAttribute Delete
ve bir hata oluştuğuna işaret eden bir parametre geçirir. Yöntemi HttpGetAttribute Delete
daha sonra hata iletisiyle birlikte onay sayfasını yeniden dağıtarak kullanıcıya iptal etme veya yeniden deneme fırsatı verir.
HttpGetAttribute
Delete
eylem yöntemini, hata raporlamayı yöneten aşağıdaki kodla değiştirin:public ActionResult Delete(int? id, bool? saveChangesError=false) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } if (saveChangesError.GetValueOrDefault()) { ViewBag.ErrorMessage = "Delete failed. Try again, and if the problem persists see your system administrator."; } Student student = db.Students.Find(id); if (student == null) { return HttpNotFound(); } return View(student); }
Bu kod, yöntemin değişiklikleri kaydetme hatasından sonra çağrılıp çağrılmadığını gösteren isteğe bağlı bir parametreyi kabul eder. Bu parametre,
false
yönteminHttpGet
Delete
önceki bir hata olmadan çağrıldığı durumdur. Veritabanı güncelleştirme hatasınaHttpPost
Delete
yanıt olarak yöntemi tarafından çağrıldığında parametresi olurtrue
ve görünüme bir hata iletisi geçirilir.HttpPostAttribute
Delete
Eylem yöntemini (adlandırılmışDeleteConfirmed
) gerçek silme işlemini gerçekleştiren ve veritabanı güncelleştirme hatalarını yakalayan aşağıdaki kodla değiştirin.[HttpPost] [ValidateAntiForgeryToken] public ActionResult Delete(int id) { try { Student student = db.Students.Find(id); db.Students.Remove(student); db.SaveChanges(); } catch (DataException/* dex */) { //Log the error (uncomment dex variable name and add a line here to write a log. return RedirectToAction("Delete", new { id = id, saveChangesError = true }); } return RedirectToAction("Index"); }
Bu kod seçili varlığı alır ve varlığın durumunu
Deleted
olarak ayarlamak için Remove yöntemini çağırır. ÇağrıldığındaSaveChanges
bir SQLDELETE
komutu oluşturulur. Eylem yöntemi adınıDeleteConfirmed
olarak da değiştirdinizDelete
. yöntemine benzersiz bir imza vermek için yöntemiDeleteConfirmed
adlıHttpPost
Delete
yapı iskelesiHttpPost
oluşturulmuş kod. (CLR, farklı yöntem parametrelerine sahip olmak için aşırı yüklenmiş yöntemler gerektirir.) artık imzalar benzersiz olduğuna göre, MVC kuralına bağlı kalıp veHttpGet
silme yöntemleri içinHttpPost
aynı adı kullanabilirsiniz.Yüksek hacimli bir uygulamada performansı geliştirmek öncelikliyse ve yöntemlerini çağıran
Find
Remove
kod satırlarını aşağıdaki kodla değiştirerek gereksiz bir SQL sorgusunun satırı almasını önleyebilirsiniz:Student studentToDelete = new Student() { ID = id }; db.Entry(studentToDelete).State = EntityState.Deleted;
Bu kod yalnızca birincil anahtar değerini kullanarak bir
Student
varlığın örneğini oluşturur ve varlık durumunu olarakDeleted
ayarlar. Varlığı silmek için Entity Framework'e gerekenler bunlardır.Belirtildiği gibi yöntemi
HttpGet
Delete
verileri silmez. GET isteğine yanıt olarak silme işlemi gerçekleştirmek (veya bu nedenle, herhangi bir düzenleme işlemi gerçekleştirmek, işlem oluşturmak veya verileri değiştiren başka bir işlem yapmak) bir güvenlik riski oluşturur. Daha fazla bilgi için bkz . ASP.NET MVC İpucu #46 — Stephen Walther'ın blogu üzerinde Güvenlik Açıkları oluşturdukları için Bağlantıları Sil'i kullanmayın.Views\Student\Delete.cshtml içinde, aşağıdaki örnekte gösterildiği gibi başlıkla
h3
başlık arasınah2
bir hata iletisi ekleyin:<h2>Delete</h2> <p class="error">@ViewBag.ErrorMessage</p> <h3>Are you sure you want to delete this?</h3>
Programı başlatıp Öğrenciler sekmesini seçip köprüyü sil'e tıklayarak sayfayı çalıştırın.
Bunu silmek istediğinizden emin misiniz? yazan sayfada Sil'i seçin.
Dizin sayfası, silinen öğrenci olmadan görüntülenir. (Eşzamanlılık öğreticisinde hata işleme kodunun bir örneğini çalışır durumda görürsünüz.)
Veritabanı bağlantılarını kapatma
Veritabanı bağlantılarını kapatmak ve ellerindeki kaynakları mümkün olan en kısa sürede boşaltmak için, bağlam örneğini işiniz bittiğinde atın. Bu nedenle, aşağıdaki örnekte gösterildiği gibi, iskelelenmiş kod StudentController.cs sınıfının sonunda StudentController
bir Dispose yöntemi sağlar:
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
Temel Controller
sınıf arabirimini IDisposable
zaten uygular, bu nedenle bu kod bağlam örneğini açıkça atmak için yöntemine bir geçersiz kılma Dispose(bool)
ekler.
İşlemleri işleme
Varsayılan olarak Entity Framework işlemleri örtük olarak uygular. Birden çok satır veya tabloda değişiklik yaptığınız ve ardından öğesini çağırdığınız SaveChanges
senaryolarda Entity Framework otomatik olarak tüm değişikliklerinizin başarılı veya başarısız olmasını sağlar. Önce bazı değişiklikler yapılır ve sonra bir hata oluşursa, bu değişiklikler otomatik olarak geri alınır. Daha fazla denetime ihtiyacınız olan senaryolar için (örneğin, bir işleme Entity Framework dışında yapılan işlemleri dahil etmek istiyorsanız) bkz . İşlemlerle Çalışma.
Kodu alma
Ek kaynaklar
Artık varlıklar için Student
basit CRUD işlemleri gerçekleştiren eksiksiz bir sayfa kümeniz var. Veri alanları için kullanıcı arabirimi öğeleri oluşturmak için MVC yardımcılarını kullandınız. MVC yardımcıları hakkında daha fazla bilgi için bkz . HTML Yardımcılarını Kullanarak Form İşleme (makale MVC 3 içindir ancak MVC 5 için hala geçerlidir).
Diğer EF 6 kaynaklarına bağlantılar ASP.NET Veri Erişimi - Önerilen Kaynaklar'da bulunabilir.
Sonraki adımlar
Bu öğreticide şunları yaptınız:
- Ayrıntılar sayfası oluşturuldu
- Oluştur sayfası güncelleştirildi
- HttpPost Edit yöntemi güncelleştirildi
- Sil sayfası güncelleştirildi
- Kapalı veritabanı bağlantıları
- İşlenen işlemler
Projeye sıralama, filtreleme ve sayfalama eklemeyi öğrenmek için sonraki makaleye ilerleyin.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin