Aracılığıyla paylaş


Öğ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:

Öğrenci ayrıntıları sayfasının ekran görüntüsü.

Öğrenci oluşturma sayfasının ekran görüntüsü.

Öğrenci silme sayfasının ekran görüntüsü.

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

  1. 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>
    
  2. 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 her Enrollment varlık için kurs başlığını ve notu görüntüler. Kurs başlığı, varlığın Course gezinti özelliğinde Course depolanan varlıktan Enrollments 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çin Courses kayıtlar, öğrencileri alan sorguda alınmadı. Bunun yerine, gezinti özelliğine ilk kez erişmeye Enrollments ç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.

  3. 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.

  4. Tarayıcıyı kapatın.

Oluştur sayfasını güncelleştirme

  1. Controllers\StudentController.cs içinde eylem yöntemini aşağıdaki kodla değiştirin HttpPostAttribute Create. Bu kod bir try-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 ekler Student 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 bir Student varlığın örneğini Form 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 ayarlamaz ID .

    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 gelen Html.AntiForgeryToken() bir deyim gerektirir.

    Bind özniteliği, oluşturma senaryolarında aşırı göndermeye karşı korumanın bir yoludur. Örneğin, varlığın Student bu web sayfasının ayarlamasını istemediğiniz bir Secret ö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öndermek Secret için fiddler gibi bir araç kullanabilir veya javascript yazabilir. BindAttribute Öznitelik, model bağlayıcısının bir Student örnek oluştururken kullandığı alanları sınırlamadan, model bağlayıcısı bu Secret form değerini alır ve varlık örneğini oluşturmak Student için kullanır. Ardından, hacker'ın form alanı için Secret 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ğerlerine Secret alanını ("OverPost" değeriyle) eklemesi gösterilmektedir.

    Oluşturucu sekmesini gösteren ekran görüntüsü. Sağ üst köşede Yürüt kırmızıyla daire içine alınır. Sağ alt köşedeki Gizli dizi, Post Üzerinde'ye eşittir kırmızıyla daire içine alınır.

    "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 kullanmak Include en iyisidir. Dışlamak istediğiniz alanları engellemek için parametresini Exclude de kullanabilirsiniz. Bunun daha güvenli olmasının nedeni Include , varlığa yeni bir özellik eklediğinizde yeni alanın bir liste tarafından Exclude otomatik 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-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 ve ValidationMessageFor yardımcıları yerine her alan DisplayForiç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.

  2. Programı başlatıp Öğrenciler sekmesini seçip Yeni Oluştur'a tıklayarak sayfayı çalıştırın.

  3. 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");
    }
    
  4. 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.

  5. Tarayıcıyı kapatın.

HttpPost Edit yöntemini güncelleştirme

  1. 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üz Details gibi seçili Student 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 listelenmeyen Bind Include alanlardaki önceden var olan verileri temizlediğinden bu kod artık önerilmez. Gelecekte MVC denetleyicisi iskelesi, Edit yöntemleri için öznitelikler oluşturmayacak Bind ş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 olarak Addedayarlanır. Ardından SaveChanges yöntemini çağırdığınızda, veritabanı bağlamı bir SQL INSERT komutu döndürür.

    Bir varlık aşağıdaki durumlardan birinde olabilir:

    • Added. Varlık henüz veritabanında yok. yönteminin SaveChanges bir INSERT deyim vermesi gerekir.
    • Unchanged. yöntemiyle bu varlıkla SaveChanges 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önteminin SaveChanges bir UPDATE deyim vermesi gerekir.
    • Deleted. Varlık silinmek üzere işaretlendi. yönteminin SaveChanges bir DELETE 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 Modifiedneden olur. Ardından çağırdığınızda SaveChanges, Entity Framework yalnızca değiştirdiğiniz gerçek özellikleri güncelleştiren bir SQL UPDATE 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ızda SaveChangesvarlık durumunu Modified. 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ığında HttpPost Edit kullanılabilir olmaları için özgün değerleri bir şekilde (gizli alanlar gibi) kaydedebilirsiniz. Ardından özgün değerleri kullanarak bir Student varlık oluşturabilir, varlığın özgün sürümüyle yöntemini çağırabilir Attach , varlığın değerlerini yeni değerlerle güncelleştirebilir ve daha fazla SaveChanges. 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.

  2. Programı başlatıp Öğrenciler sekmesini seçip bir Köprüyü düzenle'ye tıklayarak sayfayı çalıştırın.

  3. Bazı verileri değiştirin ve Kaydet'e tıklayın. Değiştirilen verileri Dizin sayfasında görürsünüz.

  4. 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.

  1. 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öntemin HttpGet Delete önceki bir hata olmadan çağrıldığı durumdur. Veritabanı güncelleştirme hatasına HttpPost Delete yanıt olarak yöntemi tarafından çağrıldığında parametresi olur true ve görünüme bir hata iletisi geçirilir.

  2. 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 Deletedolarak ayarlamak için Remove yöntemini çağırır. Çağrıldığında SaveChanges bir SQL DELETE komutu oluşturulur. Eylem yöntemi adını DeleteConfirmed olarak da değiştirdiniz Delete. yöntemine benzersiz bir imza vermek için yöntemi DeleteConfirmed adlı HttpPost Delete yapı iskelesi HttpPost 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 ve HttpGet silme yöntemleri için HttpPost 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 olarak Deletedayarlar. 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.

  3. Views\Student\Delete.cshtml içinde, aşağıdaki örnekte gösterildiği gibi başlıkla h3 başlık arasına h2 bir hata iletisi ekleyin:

    <h2>Delete</h2>
    <p class="error">@ViewBag.ErrorMessage</p>
    <h3>Are you sure you want to delete this?</h3>
    
  4. Programı başlatıp Öğrenciler sekmesini seçip köprüyü sil'e tıklayarak sayfayı çalıştırın.

  5. 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

Tamamlanan Projeyi İndir

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.