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.
Ö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 , actionve 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 ideş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
DisplayForyardımcı kullanılarak görüntülenir:<dt> @Html.DisplayNameFor(model => model.LastName) </dt> <dd> @Html.DisplayFor(model => model.LastName) </dd>Alandan
EnrollmentDatesonra 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
Enrollmentsvarlıklar arasında döngü oluşturur. Özelliğindeki herEnrollmentvarlık için kurs başlığını ve notu görüntüler. Kurs başlığı, varlığınCoursegezinti özelliğindeCoursedepolanan varlıktanEnrollmentsalı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çinCourseskayı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-catchblok 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
StudentseklerStudentve 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 birStudentvarlığın örneğiniFormoluşturur.Sql Server'ın satır eklendiğinde otomatik olarak ayarlanacağı birincil anahtar değeri olduğundan
IDBind özniteliğinden kaldırmıştınızID. Kullanıcıdan gelen giriş değeri ayarlamazID.Güvenlik uyarısı - Özniteliği siteler
ValidateAntiForgeryTokenarası 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ığınStudentbu 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
Secretalanınız olmasa bile, bir bilgisayar korsanı form değeri göndermekSecretiç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ı buSecretform değerini alır ve varlık örneğini oluşturmakStudentiçin kullanır. Ardından, hacker'ın form alanı içinSecretbelirttiği değer veritabanınızda güncelleştirilir. Aşağıdaki görüntüde, fiddler aracının gönderilen form değerlerineSecretalanı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 kullanmakIncludeen iyisidir. Dışlamak istediğiniz alanları engellemek için parametresiniExcludede kullanabilirsiniz. Bunun daha güvenli olmasının nedeniInclude, varlığa yeni bir özellik eklediğinizde yeni alanın bir liste tarafındanExcludeotomatik olarak korunmamasıdır.Düzenleme senaryolarında, varlığı önce veritabanından okuyup sonra çağrısı
TryUpdateModelyaparak 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-catchyapı 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
EditorForveValidationMessageForyardımcıları yerine her alanDisplayForiç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
ValidateAntiForgeryTokenbirlikte ç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
Editeylem 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 Edityöntemi (özniteliği olmayanHttpPost) yönteminde gördüğünüzDetailsgibi seçiliStudentvarlığı 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 listelenmeyenBindIncludealanlardaki ö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
TryUpdateModellistelenir. Ş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
SaveChangesne olacağını belirler. Örneğin, Add yöntemine yeni bir varlık geçirdiğinizde, bu varlığın durumu olarakAddedayarlanır. Ardından SaveChanges yöntemini çağırdığınızda, veritabanı bağlamı bir SQLINSERTkomutu döndürür.Bir varlık aşağıdaki durumlardan birinde olabilir:
Added. Varlık henüz veritabanında yok. yöntemininSaveChangesbirINSERTdeyim vermesi gerekir.Unchanged. yöntemiyle bu varlıklaSaveChangeshiç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öntemininSaveChangesbirUPDATEdeyim vermesi gerekir.Deleted. Varlık silinmek üzere işaretlendi. yöntemininSaveChangesbirDELETEdeyimi 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
Modifiedneden olur. Ardından çağırdığınızdaSaveChanges, Entity Framework yalnızca değiştirdiğiniz gerçek özellikleri güncelleştiren bir SQLUPDATEdeyimi 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.
HttpPostEditEylem 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ızdaSaveChangesvarlı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
Updatedeyiminin yalnızca kullanıcının gerçekten değiştirdiği alanları güncelleştirmesini istiyorsanız, yöntem çağrıldığındaHttpPostEditkullanılabilir olmaları için özgün değerleri bir şekilde (gizli alanlar gibi) kaydedebilirsiniz. Ardından özgün değerleri kullanarak birStudentvarlı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
Deleteeylem 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,
falseyönteminHttpGetDeleteönceki bir hata olmadan çağrıldığı durumdur. Veritabanı güncelleştirme hatasınaHttpPostDeleteyanıt olarak yöntemi tarafından çağrıldığında parametresi olurtrueve görünüme bir hata iletisi geçirilir.HttpPostAttribute
DeleteEylem 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
Deletedolarak ayarlamak için Remove yöntemini çağırır. ÇağrıldığındaSaveChangesbir SQLDELETEkomutu oluşturulur. Eylem yöntemi adınıDeleteConfirmedolarak da değiştirdinizDelete. yöntemine benzersiz bir imza vermek için yöntemiDeleteConfirmedadlıHttpPostDeleteyapı iskelesiHttpPostoluş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 veHttpGetsilme yöntemleri içinHttpPostaynı adı kullanabilirsiniz.Yüksek hacimli bir uygulamada performansı geliştirmek öncelikliyse ve yöntemlerini çağıran
FindRemovekod 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
Studentvarlığın örneğini oluşturur ve varlık durumunu olarakDeletedayarlar. Varlığı silmek için Entity Framework'e gerekenler bunlardır.Belirtildiği gibi yöntemi
HttpGetDeleteverileri 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.Views\Student\Delete.cshtml içinde, aşağıdaki örnekte gösterildiği gibi başlıkla
h3başlık arasınah2bir 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 SaveChangessenaryolarda 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.