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 desenini 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ı kapat
  • İşlemleri işleme

Önkoşullar

Ayrıntılar sayfası oluşturma

Öğrenciler Index sayfasının iskelesi oluşturulmuş kodu özelliğin dışında Enrollments bırakıldı çünkü bu özellik bir koleksiyon barındırıyor. Sayfada, koleksiyonun Details içeriğini bir HTML tablosunda görüntüleyeceksiniz.

Controllers\StudentController.cs dosyasında, görünümün Details eylem yöntemi tek Student bir varlığı almak için Find 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 yöntemine parametresi olarak id 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, actionIndex ile ve 1 ile ideşlenir Instructorcontroller; bunlar yol veri değerleridir.

http://localhost:1230/Instructor/Index/1?courseID=2021

?courseID=2021 bir sorgu dizesi değeridir. Model bağlayıcısı, sorgu dizesi değeri olarak geçirirseniz id de ç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 CourseEnrollments depolanan varlıktan alınır. Bu verilerin tümü gerektiğinde veritabanından otomatik olarak alınır. Başka bir deyişle, burada gecikmeli 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 bilgi edinmek için bu serinin devamında yer alan İlgili Verileri Okuma öğreticisini okuyabilirsiniz.

  3. Programı (Ctrl+F5) başlatıp Öğrenciler sekmesini seçip Alexander Carson'ın Ayrıntılar bağlantısına tıklayarak Ayrıntılar sayfasını açın. (Ctrl tuşuna+ basarsanızDetails.cshtml dosyası açıkken F5,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 veTarayıcıda Görünüm'e> 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 dosyasında, HttpPostAttributeCreate eylem yöntemini aşağıdaki kodla değiştirin. Bu kod bir try-catch blok ekler ve iskelesi oluşturulan yöntemin ö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ı, deftere nakledilen form değerlerini CLR türlerine dönüştürür ve bunları parametrelerde 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 satır eklendiğinde otomatik olarak ayarlanacak 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 ValidateAntiForgeryTokenarası 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 fazla 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. Öznitelik, model bağlayıcısının BindAttribute 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 Secret alanı ("OverPost" değeriyle) deftere nakledilen form değerlerine 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öşede Gizli dizi eşittir Gönderi kırmızı daire içine alınır.

    Web sayfasının bu özelliği ayarlayabilmesini Secret hiçbir zaman amaçlamasanız da, "OverPost" değeri eklenen satırın özelliğine başarıyla eklenir.

    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 ardından ç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ğlama ile 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. Varlık örneğinde durumunu Değiştirilmemiş olarak ayarlamak için girdi ve ardından Property("PropertyName") değerini ayarlayın. Görünüm modeline dahil edilen her varlık özelliğinde IsModified değerini true olarak ayarlayın. Bu yöntem hem düzenleme hem de oluşturma senaryolarında çalışır.

    özniteliği dışında Bind blok, try-catch iskelesi oluşturulmuş kodda yaptığınız tek değişikliktir. Değişiklikler kaydedilirken türetilen DataException bir özel durum yakalanırsa, genel bir hata iletisi görüntülenir. DataException özel durumlara bazen programlama hatası yerine uygulamanın dışında bir şey neden olur, bu nedenle kullanıcının yeniden denemesi tavsiye edilir. Bu örnekte uygulanmasa da, üretim kalitesi uygulaması özel durumu günlüğe kaydeder. Daha fazla bilgi için İzleme ve Telemetri (Azure ile Real-World Cloud Apps Oluşturma) bölümündeki İçgörüler için günlüğe kaydetme 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 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ğrulaması için kod oluşturan özniteliklerin nasıl ekleneceğini göreceksiniz. Aşağıdaki vurgulanan kod , Create yöntemindeki model doğrulama denetimini gösterir.

    if (ModelState.IsValid)
    {
        db.Students.Add(student);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    
  4. Yeni öğrencinin Dizin sayfasında görünmesi için tarihi geçerli bir değerle değiştirin ve Oluştur'a tıklayın.

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

HttpPost Edit yöntemini güncelleştirme

  1. HttpPostAttributeEdit 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.csHttpGet Edit dosyasında 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şımları önlemek için en iyi güvenlik 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. Özniteliği parametresinde listelenmeyen BindInclude alanlardaki önceden var olan verileri temizlediğinden bu kod artık önerilmez. Gelecekte MVC denetleyicisi yapı 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 olarak ayarlayabilir ve tek tek alanları EntityState.Modified olarak ayarlayabilirsiniz.)

    Fazla paylaşımları ö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 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ıysanız.

    İpucu

    Varlık Durumları ve Ekleme ve SaveChanges Yöntemleri

    Veritabanı bağlamı, bellekteki varlıkların veritabanındaki karşılık gelen satırlarıyla eşitlenip eşitlenmediğini izler ve bu bilgiler yöntemini ç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 bir kısmı 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.

    Bir 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. HttpPostEdit 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. Sonra olarak el ile ayarlamanız gerekir. Bağlamın hangi özellikleri değiştirdiğinize dair bir yolu 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, özgün değerleri bir şekilde (gizli alanlar gibi) kaydederek yöntem çağrıldığında HttpPostEdit kullanılabilir olmasını sağlayabilirsiniz. Ardından özgün değerleri kullanarak bir Student varlık oluşturabilir, varlığın Attach özgün sürümüyle yöntemini çağırabilir, 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 düzenle köprüsüne tıklayarak sayfayı çalıştırın.

  3. Verilerin bazılarını 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 dosyasında yönteminin HttpGetAttributeDelete ş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 buna karşılık gelen görünüme 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 HttpPostDelete çağrılır ve 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 HttpPostAttributeDelete ekleyeceksiniz. Bir hata oluşursa yöntemi HttpPostAttributeDelete yöntemini çağırarak HttpGetAttributeDelete bir hata oluştuğuna işaret eden bir parametre geçirir. Yöntemi HttpGetAttributeDelete daha sonra hata iletisiyle birlikte onay sayfasını yeniden dağıtarak kullanıcıya iptal etme veya yeniden deneme fırsatı verir.

  1. HttpGetAttributeDelete 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, değişiklikleri kaydetme hatasından sonra yöntemin çağrılıp çağrılmadığını gösteren isteğe bağlı bir parametre kabul eder. Bu parametre, false yöntemin HttpGetDelete önceki bir hata olmadan çağrıldığı durumdur. Veritabanı güncelleştirme hatasına HttpPostDelete 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. HttpPostAttributeDelete 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öntemini DeleteConfirmed adlı HttpPostDelete 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ı kalarak 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 FindRemove 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 HttpGetDelete 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 blog'larında 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 bir Sil köprüsüne tıklayarak sayfayı çalıştırın.

  5. Bunu silmekistediğ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 göreceksiniz.)

veritabanı bağlantıları kapat

veritabanı bağlantıları kapatmak ve ellerindeki kaynakları 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, yapı iskelesi oluşturulmuş kod StudentController.cs'de sınıfın StudentController sonunda 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 Dispose(bool) yöntemine bir geçersiz kılma 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 bölümünde 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.