Öğretici: MVC 5 Web uygulaması için gelişmiş EF Senaryoları hakkında bilgi edinin

Önceki öğreticide hiyerarşi başına tablo devralmayı uyguladınız. Bu öğretici, Entity Framework Code First kullanan ASP.NET web uygulamaları geliştirmenin temellerini aştığınızda dikkat etmeniz gereken birkaç konu içerir. İlk birkaç bölümde, kodda size yol gösteren adım adım yönergeler ve görevleri tamamlamak için Visual Studio'yu kullanma yönergeleri yer alır. Aşağıdaki bölümlerde, kısa tanıtımlar ve daha fazla bilgi için kaynaklara bağlantılar içeren çeşitli konular tanıtılmaktadır.

Bu konuların çoğunda, önceden oluşturduğunuz sayfalarla çalışacaksınız. Toplu güncelleştirmeler yapmak üzere ham SQL kullanmak için veritabanındaki tüm kursların kredi sayısını güncelleştiren yeni bir sayfa oluşturacaksınız:

Update_Course_Credits_initial_page

Bu öğreticide şunları yaptınız:

  • Ham SQL sorgularını gerçekleştirme
  • İzleme olmayan sorgular gerçekleştirme
  • Veritabanına gönderilen SQL sorgularını inceleme

Ayrıca şunları da öğrenirsiniz:

  • Soyutlama katmanı oluşturma
  • Ara sunucu sınıfları
  • Otomatik değişiklik algılama
  • Otomatik doğrulama
  • Entity Framework Power Tools
  • Entity Framework kaynak kodu

Önkoşul

Ham SQL sorgularını gerçekleştirme

Entity Framework Code First API'sinde SQL komutlarını doğrudan veritabanına geçirmenizi sağlayan yöntemler bulunur. Aşağıdaki seçenekler mevcuttur:

  • Varlık türlerini döndüren sorgular için DbSet.SqlQuery yöntemini kullanın. Döndürülen nesneler nesne tarafından DbSet beklenen türde olmalıdır ve izlemeyi kapatmadığınız sürece veritabanı bağlamı tarafından otomatik olarak izlenir. ( AsNoTracking yöntemi hakkında aşağıdaki bölüme bakın.)
  • Varlık olmayan türler döndüren sorgular için Database.SqlQuery yöntemini kullanın. Varlık türlerini almak için bu yöntemi kullansanız bile döndürülen veriler veritabanı bağlamı tarafından izlenmez.
  • Sorgu olmayan komutlar için Database.ExecuteSqlCommand kullanın.

Entity Framework kullanmanın avantajlarından biri, kodunuzu belirli bir veri depolama yöntemine çok yakın bağlamaktan kaçınmasıdır. Bunu, sizin için SQL sorguları ve komutları oluşturarak yapar ve bu da bunları kendiniz yazmaktan kurtulmanızı sağlar. Ancak el ile oluşturduğunuz belirli SQL sorgularını çalıştırmanız gerektiğinde olağanüstü senaryolar vardır ve bu yöntemler bu tür özel durumları işlemenizi mümkün kılar.

Bir web uygulamasında SQL komutlarını yürüttüğünüzde her zaman olduğu gibi sitenizi SQL ekleme saldırılarına karşı korumak için önlemler almanız gerekir. Bunu yapma yollarından biri, bir web sayfası tarafından gönderilen dizelerin SQL komutları olarak yorumlanamaz olduğundan emin olmak için parametreli sorgular kullanmaktır. Bu öğreticide, kullanıcı girişini sorguyla tümleştirirken parametreli sorgular kullanacaksınız.

Varlıkları Döndüren Bir Sorguyu Çağırma

DbSet<TEntity> sınıfı, türünde TEntitybir varlık döndüren bir sorguyu yürütmek için kullanabileceğiniz bir yöntem sağlar. Bunun nasıl çalıştığını görmek için denetleyicinin yöntemindeki DetailsDepartment kodu değiştireceksiniz.

DepartmentController.cs dosyasındaki yöntemindeDetails, aşağıdaki vurgulanan kodda gösterildiği gibi yöntem çağrısını bir db.Departments.SqlQuery yöntem çağrısıyla değiştirindb.Departments.FindAsync:

public async Task<ActionResult> Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }

    // Commenting out original code to show how to use a raw SQL query.
    //Department department = await db.Departments.FindAsync(id);

    // Create and execute raw SQL query.
    string query = "SELECT * FROM Department WHERE DepartmentID = @p0";
    Department department = await db.Departments.SqlQuery(query, id).SingleOrDefaultAsync();
    
    if (department == null)
    {
        return HttpNotFound();
    }
    return View(department);
}

Yeni kodun düzgün çalıştığını doğrulamak için Departmanlar sekmesini ve ardından departmanlardan birinin Ayrıntıları'nı seçin. Tüm verilerin beklendiği gibi göründüğünden emin olun.

Diğer Nesne Türlerini Döndüren Bir Sorguyu Çağırma

Daha önce, Hakkında sayfası için her kayıt tarihi için öğrenci sayısını gösteren bir öğrenci istatistikleri kılavuzu oluşturdunuz. HomeController.cs dosyasında bunu sağlayan kod LINQ kullanır:

var data = from student in db.Students
           group student by student.EnrollmentDate into dateGroup
           select new EnrollmentDateGroup()
           {
               EnrollmentDate = dateGroup.Key,
               StudentCount = dateGroup.Count()
           };

LINQ kullanmak yerine bu verileri doğrudan SQL'de alan kodu yazmak istediğinizi varsayalım. Bunu yapmak için varlık nesnelerinden başka bir şey döndüren bir sorgu çalıştırmanız gerekir; bu da Database.SqlQuery yöntemini kullanmanız gerektiği anlamına gelir.

HomeController.cs dosyasında, aşağıdaki vurgulanan kodda About gösterildiği gibi yöntemindeki LINQ deyimini bir SQL deyimiyle değiştirin:

public ActionResult About()
{
    // Commenting out LINQ to show how to do the same thing in SQL.
    //IQueryable<EnrollmentDateGroup> = from student in db.Students
    //           group student by student.EnrollmentDate into dateGroup
    //           select new EnrollmentDateGroup()
    //           {
    //               EnrollmentDate = dateGroup.Key,
    //               StudentCount = dateGroup.Count()
    //           };

    // SQL version of the above LINQ code.
    string query = "SELECT EnrollmentDate, COUNT(*) AS StudentCount "
        + "FROM Person "
        + "WHERE Discriminator = 'Student' "
        + "GROUP BY EnrollmentDate";
    IEnumerable<EnrollmentDateGroup> data = db.Database.SqlQuery<EnrollmentDateGroup>(query);

    return View(data.ToList());
}

Hakkında sayfasını çalıştırın. Daha önce görüntülediği verileri görüntülediğini doğrulayın.

Güncelleştirme Sorgusu Çağırma

Contoso Üniversitesi yöneticilerinin veritabanında her kursun kredi sayısını değiştirme gibi toplu değişiklikler yapabilmek istediğini varsayalım. Üniversitenin çok sayıda kursu varsa, bunların tümünü varlık olarak almak ve tek tek değiştirmek verimsiz olacaktır. Bu bölümde, kullanıcının tüm kurslar için kredi sayısını değiştirecek bir faktör belirtmesine olanak tanıyan bir web sayfası uygulayacak ve değişikliği bir SQL UPDATE deyimi yürüterek yapacaksınız.

CourseController.cs dosyasında ve HttpPostiçin HttpGet yöntemler ekleyinUpdateCourseCredits:

public ActionResult UpdateCourseCredits()
{
    return View();
}

[HttpPost]
public ActionResult UpdateCourseCredits(int? multiplier)
{
    if (multiplier != null)
    {
        ViewBag.RowsAffected = db.Database.ExecuteSqlCommand("UPDATE Course SET Credits = Credits * {0}", multiplier);
    }
    return View();
}

Denetleyici bir HttpGet isteği işlediğinde değişkende hiçbir şey döndürülmüyor ve görünümde ViewBag.RowsAffected boş bir metin kutusu ve gönder düğmesi görüntüleniyor.

Güncelleştir düğmesine tıklandığında HttpPost yöntemi çağrılır ve multiplier metin kutusuna değeri girilir. Kod daha sonra kursları güncelleştiren SQL'i yürütür ve etkilenen satır sayısını değişkendeki ViewBag.RowsAffected görünüme döndürür. Görünüm bu değişkende bir değer aldığında, metin kutusu ve gönder düğmesi yerine güncelleştirilen satır sayısını görüntüler.

CourseController.cs dosyasında yöntemlerden birine UpdateCourseCredits sağ tıklayın ve görünüm ekle'ye tıklayın. Görünüm Ekle iletişim kutusu görüntülenir. Varsayılan değerleri değiştirmeyin ve Ekle'yi seçin.

Views\Course\UpdateCourseCredits.cshtml dosyasında şablon kodunu aşağıdaki kodla değiştirin:

@model ContosoUniversity.Models.Course

@{
    ViewBag.Title = "UpdateCourseCredits";
}

<h2>Update Course Credits</h2>

@if (ViewBag.RowsAffected == null)
{
    using (Html.BeginForm())
    {
        <p>
            Enter a number to multiply every course's credits by: @Html.TextBox("multiplier")
        </p>
        <p>
            <input type="submit" value="Update" />
        </p>
    }
}
@if (ViewBag.RowsAffected != null)
{
    <p>
        Number of rows updated: @ViewBag.RowsAffected
    </p>
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>

Kurslar sekmesini seçip tarayıcının UpdateCourseCredits adres çubuğundaki URL'nin sonuna "/UpdateCourseCredits" ekleyerek yöntemini çalıştırın (örneğin: http://localhost:50205/Course/UpdateCourseCredits). Metin kutusuna bir sayı girin:

Update_Course_Credits_initial_page_with_2_entered

Güncelleştir’e tıklayın. Etkilenen satır sayısını görürsünüz.

Düzeltilmiş kredi sayısına sahip kursların listesini görmek için Listeye Geri Dön'e tıklayın.

Ham SQL sorguları hakkında daha fazla bilgi için bkz. MSDN'de Ham SQL Sorguları .

İzleme olmayan sorgular

Veritabanı bağlamı tablo satırlarını aldığında ve bunları temsil eden varlık nesneleri oluşturduğunda, varsayılan olarak bellekteki varlıkların veritabanındakilerle eşitlenmiş olup olmadığını izler. Bellekteki veriler önbellek görevi görür ve varlığı güncelleştirdiğinizde kullanılır. Bağlam örnekleri genellikle kısa ömürlü olduğundan (her istek için yeni bir tane oluşturulur ve atılır) ve varlığı okuyan bağlam genellikle varlık yeniden kullanılmadan önce atıldığından, bu önbelleğe alma genellikle web uygulamasında gereksizdir.

AsNoTracking yöntemini kullanarak bellekteki varlık nesnelerinin izlenmesini devre dışı bırakabilirsiniz. Bunu yapmak isteyebileceğiniz tipik senaryolar şunlardır:

  • Bir sorgu, izlemeyi kapatmanın performansı önemli ölçüde artırabileceği kadar büyük bir veri hacmini alır.
  • Güncelleştirmek için bir varlık eklemek istiyorsunuz, ancak daha önce aynı varlığı farklı bir amaç için aldıysanız. Varlık veritabanı bağlamı tarafından zaten izlendiğinden, değiştirmek istediğiniz varlığı ekleyemezsiniz. Bu durumu işlemenin bir yolu, önceki sorguyla seçeneğini kullanmaktır AsNoTracking .

AsNoTracking yönteminin nasıl kullanılacağını gösteren bir örnek için bu öğreticinin önceki sürümüne bakın. Öğreticinin bu sürümü, Edit yönteminde model binder tarafından oluşturulan bir varlıkta Değiştirildi bayrağını ayarlamaz, bu nedenle gerekli AsNoTrackingdeğildir.

Veritabanına gönderilen SQL'i inceleme

Bazen veritabanına gönderilen gerçek SQL sorgularını görebilmek yararlı olabilir. Önceki öğreticilerde kesme noktası kodunda bunu nasıl yapacağınızı gördünüz; şimdi kesme noktası kodu yazmadan bunu yapmanın bazı yollarını göreceksiniz. Bunu denemek için basit bir sorguya göz atacak ve ardından hevesle yükleme, filtreleme ve sıralama gibi seçenekler eklerken bu sorguya ne olacağına bakacaksınız.

Controllers/CourseController'da, istekli yüklemeyi geçici olarak durdurmak için yöntemini aşağıdaki kodla değiştirinIndex:

public ActionResult Index()
{
    var courses = db.Courses;
    var sql = courses.ToString();
    return View(courses.ToList());
}

Şimdi deyiminde return bir kesme noktası ayarlayın (Imleç bu satırdayken F9). Projeyi hata ayıklama modunda çalıştırmak için F5 tuşuna basın ve Kurs Dizini sayfasını seçin. Kod kesme noktasına ulaştığında değişkenini sql inceleyin. SQL Server gönderilen sorguyu görürsünüz. Basit bir Select ifade.

{SELECT 
[Extent1].[CourseID] AS [CourseID], 
[Extent1].[Title] AS [Title], 
[Extent1].[Credits] AS [Credits], 
[Extent1].[DepartmentID] AS [DepartmentID]
FROM [Course] AS [Extent1]}

Sorguyu Metin Görselleştiricisi'nde görmek için büyütece tıklayın.

Bir kod satırının vurgulandığı Kurs Denetleyicisi'ni gösteren ekran görüntüsü. Metin Görselleştiricisi'nin açık olduğunu ve değer alanında bir büyüteç kırmızıyla daire içine alındığını gösteren başka bir ekran görüntüsü.

Şimdi, kullanıcıların belirli bir departman için filtre uygulayabilmesi için Kurs Dizini sayfasına bir açılan liste ekleyeceksiniz. Kursları başlığa göre sıralar ve gezinti özelliği için hevesle Department yüklemeyi belirtirsiniz.

CourseController.cs dosyasında yöntemini aşağıdaki kodla değiştirinIndex:

public ActionResult Index(int? SelectedDepartment)
{
    var departments = db.Departments.OrderBy(q => q.Name).ToList();
    ViewBag.SelectedDepartment = new SelectList(departments, "DepartmentID", "Name", SelectedDepartment);
    int departmentID = SelectedDepartment.GetValueOrDefault();

    IQueryable<Course> courses = db.Courses
        .Where(c => !SelectedDepartment.HasValue || c.DepartmentID == departmentID)
        .OrderBy(d => d.CourseID)
        .Include(d => d.Department);
    var sql = courses.ToString();
    return View(courses.ToList());
}

deyimindeki kesme noktasını return geri yükleyin.

yöntemi, parametresindeki açılan listenin SelectedDepartment seçili değerini alır. Hiçbir şey seçilmezse, bu parametre null olur.

SelectList Tüm bölümleri içeren bir koleksiyon, açılan listenin görünümüne geçirilir. Oluşturucuya SelectList geçirilen parametreler değer alanı adını, metin alanı adını ve seçili öğeyi belirtir.

Get Deponun yöntemi Course için kod bir filtre ifadesi, bir sıralama düzeni ve gezinti özelliği için Department istekli yükleme belirtir. Açılan listede hiçbir şey seçilmezse (yani null olduğunda) SelectedDepartment filtre ifadesi her zaman döndürürtrue.

Views\Course\Index.cshtml dosyasında, açılış table etiketinden hemen önce açılan listeyi ve gönder düğmesini oluşturmak için aşağıdaki kodu ekleyin:

@using (Html.BeginForm())
{
    <p>Select Department: @Html.DropDownList("SelectedDepartment","All")   
    <input type="submit" value="Filter" /></p>
}

Kesme noktası hala ayarlanmış durumdayken Kurs Dizini sayfasını çalıştırın. Sayfanın tarayıcıda görüntülenmesi için kodun bir kesme noktasına ilk kez isabet etmesiyle devam edin. Açılan listeden bir bölüm seçin ve Filtre'ye tıklayın.

Bu kez ilk kesme noktası, açılan listenin departmanlar sorgusuna yönelik olacaktır. Bunu atlayın ve sorgunun query şimdi nasıl Course göründüğünü görmek için kod kesme noktasına bir sonraki eriştiğinde değişkeni görüntüleyin. Aşağıdakine benzer bir şey görürsünüz:

SELECT 
    [Project1].[CourseID] AS [CourseID], 
    [Project1].[Title] AS [Title], 
    [Project1].[Credits] AS [Credits], 
    [Project1].[DepartmentID] AS [DepartmentID], 
    [Project1].[DepartmentID1] AS [DepartmentID1], 
    [Project1].[Name] AS [Name], 
    [Project1].[Budget] AS [Budget], 
    [Project1].[StartDate] AS [StartDate], 
    [Project1].[InstructorID] AS [InstructorID], 
    [Project1].[RowVersion] AS [RowVersion]
    FROM ( SELECT 
        [Extent1].[CourseID] AS [CourseID], 
        [Extent1].[Title] AS [Title], 
        [Extent1].[Credits] AS [Credits], 
        [Extent1].[DepartmentID] AS [DepartmentID], 
        [Extent2].[DepartmentID] AS [DepartmentID1], 
        [Extent2].[Name] AS [Name], 
        [Extent2].[Budget] AS [Budget], 
        [Extent2].[StartDate] AS [StartDate], 
        [Extent2].[InstructorID] AS [InstructorID], 
        [Extent2].[RowVersion] AS [RowVersion]
        FROM  [dbo].[Course] AS [Extent1]
        INNER JOIN [dbo].[Department] AS [Extent2] ON [Extent1].[DepartmentID] = [Extent2].[DepartmentID]
        WHERE @p__linq__0 IS NULL OR [Extent1].[DepartmentID] = @p__linq__1
    )  AS [Project1]
    ORDER BY [Project1].[CourseID] ASC

Sorgunun artık verilerle Course birlikte veri yükleyen Department bir JOIN sorgu olduğunu ve bir WHERE yan tümcesi içerdiğini görebilirsiniz.

var sql = courses.ToString() Satırı kaldırın.

Soyutlama katmanı oluşturma

Birçok geliştirici, Entity Framework ile çalışan bir kod çevresinde sarmalayıcı olarak depo ve iş desenleri birimini uygulamak için kod yazar. Bu desenler, veri erişim katmanı ile bir uygulamanın iş mantığı katmanı arasında bir soyutlama katmanı oluşturmak için tasarlanmıştır. Bu desenleri uygulamak, uygulamanızı veri deposundaki değişikliklerden yalıtmanıza yardımcı olabilir ve otomatik birim testini veya test temelli geliştirmeyi (TDD) kolaylaştırabilir. Ancak bu desenleri uygulamak için ek kod yazmak, EF kullanan uygulamalar için her zaman en iyi seçenek değildir. Bunun çeşitli nedenleri vardır:

  • EF bağlam sınıfı, kodunuzu veri deposuna özgü koddan yalıtıyor.
  • EF bağlam sınıfı, EF kullanarak yaptığınız veritabanı güncelleştirmeleri için bir iş birimi sınıfı görevi görebilir.
  • Entity Framework 6'da sunulan özellikler, depo kodu yazmadan TDD'yi uygulamayı kolaylaştırır.

Depo ve iş birimi desenlerini uygulama hakkında daha fazla bilgi için bu öğretici serisinin Entity Framework 5 sürümüne bakın. Entity Framework 6'da TDD'yi uygulamanın yolları hakkında bilgi için aşağıdaki kaynaklara bakın:

Ara sunucu sınıfları

Entity Framework varlık örnekleri oluşturduğunda (örneğin, bir sorgu yürüttüğünde), bunları genellikle varlık için ara sunucu işlevi gören dinamik olarak oluşturulmuş türetilmiş bir türün örnekleri olarak oluşturur. Örneğin, aşağıdaki iki hata ayıklayıcı görüntüsüne bakın. İlk görüntüde, varlığın örneğini student oluşturmadan hemen sonra değişkenin beklenen Student tür olduğunu görürsünüz. İkinci görüntüde EF veritabanından bir öğrenci varlığını okumak için kullanıldıktan sonra ara sunucu sınıfını görürsünüz.

Ara sunucu sınıfından önce

Proxy sınıfından sonra

Bu proxy sınıfı, özelliğe erişildiğinde eylemleri otomatik olarak gerçekleştirmek için kanca eklemek üzere varlığın bazı sanal özelliklerini geçersiz kılar. Bu mekanizmanın kullanıldığı işlevlerden biri gecikmeli yüklemedir.

Çoğu zaman proxy'lerin bu kullanımından haberdar olmanız gerekmez, ancak istisnalar vardır:

  • Bazı senaryolarda Entity Framework'ün ara sunucu örnekleri oluşturmasını engellemek isteyebilirsiniz. Örneğin, varlıkları seri hale getirirken genellikle ara sunucu sınıflarını değil POCO sınıflarını istersiniz. Entity Framework ile Web API'sini Kullanma öğreticisinde gösterildiği gibi, serileştirme sorunlarını önlemenin bir yolu varlık nesneleri yerine veri aktarım nesnelerini (DTO' lar) seri hale getirmektir. Bir diğer yol da ara sunucu oluşturmayı devre dışı bırakmaktır.
  • işlecini kullanarak bir varlık sınıfı örneği new oluşturduğunuzda, ara sunucu örneği almazsınız. Bu, gecikmeli yükleme ve otomatik değişiklik izleme gibi işlevlere sahip olmadığınız anlamına gelir. Bu genellikle sorun değildir; veritabanında olmayan yeni bir varlık oluşturduğunuz ve varlığı açıkça olarak Addedolarak işaretliyorsanız genellikle değişiklik izlemeye gerek duymadığınız için genellikle gecikmeli yüklemeye ihtiyacınız yoktur. Ancak, gecikmeli yüklemeye ihtiyacınız varsa ve değişiklik izlemeye ihtiyacınız varsa, sınıfının Create yöntemini DbSet kullanarak proxy'lerle yeni varlık örnekleri oluşturabilirsiniz.
  • Bir ara sunucu türünden gerçek bir varlık türü almak isteyebilirsiniz. Bir ara sunucu türü örneğinin gerçek varlık türünü almak için sınıfının GetObjectType yöntemini ObjectContext kullanabilirsiniz.

Daha fazla bilgi için bkz. MSDN'de Proxy'lerle Çalışma .

Otomatik değişiklik algılama

Entity Framework, bir varlığın geçerli değerlerini özgün değerlerle karşılaştırarak varlığın nasıl değiştiğini (ve bu nedenle veritabanına hangi güncelleştirmelerin gönderilmesi gerektiğini) belirler. Özgün değerler, varlık sorgulandığında veya eklendiğinde depolanır. Otomatik değişiklik algılamaya neden olan yöntemlerden bazıları şunlardır:

  • DbSet.Find
  • DbSet.Local
  • DbSet.Remove
  • DbSet.Add
  • DbSet.Attach
  • DbContext.SaveChanges
  • DbContext.GetValidationErrors
  • DbContext.Entry
  • DbChangeTracker.Entries

Çok sayıda varlığı izliyorsanız ve bu yöntemlerden birini döngü içinde birçok kez çağırıyorsanız, AutoDetectChangesEnabled özelliğini kullanarak otomatik değişiklik algılamayı geçici olarak kapatarak önemli performans iyileştirmeleri alabilirsiniz. Daha fazla bilgi için bkz. MSDN'de Değişiklikleri Otomatik Olarak Algılama .

Otomatik doğrulama

yöntemini çağırdığınızda SaveChanges , Entity Framework varsayılan olarak veritabanını güncelleştirmeden önce değiştirilen tüm varlıkların tüm özelliklerindeki verileri doğrular. Çok sayıda varlığı güncelleştirdiyseniz ve verileri zaten doğruladıysanız, bu iş gereksizdir ve doğrulamayı geçici olarak kapatarak değişiklikleri kaydetme işleminin daha az zaman almasını sağlayabilirsiniz. ValidateOnSaveEnabled özelliğini kullanarak bunu yapabilirsiniz. Daha fazla bilgi için bkz. MSDN'de Doğrulama .

Entity Framework Power Tools

Entity Framework Power Tools , bu öğreticilerde gösterilen veri modeli diyagramlarını oluşturmak için kullanılan bir Visual Studio eklentisidir. Araçlar, veritabanını Code First ile kullanabilmeniz için var olan bir veritabanındaki tabloları temel alan varlık sınıfları oluşturma gibi başka işlevler de gerçekleştirebilir. Araçları yükledikten sonra bağlam menülerinde bazı ek seçenekler görüntülenir. Örneğin, Çözüm Gezgini bağlam sınıfınıza sağ tıkladığınızda ve Entity Framework seçeneğini görürsünüz. Bu size diyagram oluşturma olanağı sağlar. Code First kullanırken diyagramdaki veri modelini değiştiremezsiniz, ancak anlaşılmasını kolaylaştırmak için öğeleri taşıyabilirsiniz.

EF diyagramı

Entity Framework kaynak kodu

Entity Framework 6 için kaynak kodu GitHub'da bulunabilir. Hataları dosyalayabilir ve EF kaynak kodunda kendi geliştirmelerinize katkıda bulunabilirsiniz.

Kaynak kodu açık olsa da Entity Framework bir Microsoft ürünü olarak tam olarak desteklenir. Microsoft Entity Framework ekibi, hangi katkıların kabul edilir olduğunu denetler ve her sürümün kalitesini sağlamak için tüm kod değişikliklerini test eder.

Teşekkürler

  • Tom Dykstra bu öğreticinin özgün sürümünü yazdı, EF 5 güncelleştirmesini birlikte yazdı ve EF 6 güncelleştirmesini yazdı. Tom, Microsoft Web Platformu ve Araçları İçerik Ekibi'nin kıdemli programlama yazarıdır.
  • Rick Anderson (twitter @RickAndMSFT), EF 5 ve MVC 4 öğreticisini güncelleştiren ve EF 6 güncelleştirmesini birlikte yazan işlerin çoğunu yaptı. Rick, Microsoft'un Azure ve MVC'ye odaklanan kıdemli bir programlama yazarıdır.
  • Rowan Miller ve Entity Framework ekibinin diğer üyeleri, kod incelemelerine yardımcı oldu ve EF 5 ve EF 6 öğreticisini güncelleştirirken ortaya çıktı geçişlerle ilgili birçok sorunun hatalarını ayıklamaya yardımcı oldu.

Sık karşılaşılan hataları giderme

Gölge kopya oluşturulamıyor/gölge kopya oluşturulamıyor

Hata İletisi:

Bu dosya zaten mevcut olduğunda '<dosya adı>' oluşturulamaz/gölge kopya oluşturulamaz.

Çözüm

Birkaç saniye bekleyin ve sayfayı yenileyin.

Update-Database tanınmıyor

Hata İletisi (PMC'deki komuttan Update-Database ):

'Update-Database' terimi bir cmdlet, işlev, betik dosyası veya çalıştırılabilir programın adı olarak tanınmaz. Adın yazımını denetleyin veya yol eklenmişse yolun doğru olduğunu doğrulayın ve yeniden deneyin.

Çözüm

Visual Studio'dan çıkın. Projeyi yeniden açın ve yeniden deneyin.

Doğrulama başarısız oldu

Hata İletisi (PMC'deki komuttan Update-Database ):

Bir veya daha fazla varlık için doğrulama başarısız oldu. Daha fazla ayrıntı için bkz. 'EntityValidationErrors' özelliği.

Çözüm

Bu sorunun bir nedeni, yöntem çalıştırıldığında karşılaşılan Seed doğrulama hatalarıdır. Yöntemin hatalarını ayıklamaya ilişkin ipuçları için bkz. Varlık Çerçevesi (EF) DB'lerinde Çekirdek Oluşturma ve Hata Ayıklama Seed .

HTTP 500.19 hatası

Hata İletisi:

HTTP Hatası 500.19 - İç Sunucu Hatası Sayfanın ilgili yapılandırma verileri geçersiz olduğundan istenen sayfaya erişilemiyor.

Çözüm

Bu hatayı alma yollarından biri, çözümün her biri aynı bağlantı noktası numarasını kullanan birden çok kopyasına sahip olmaktır. Bu sorunu genellikle Visual Studio'nun tüm örneklerinden çıkıp üzerinde çalıştığınız projeyi yeniden başlatarak çözebilirsiniz. Bu işe yaramazsa bağlantı noktası numarasını değiştirmeyi deneyin. Proje dosyasına sağ tıklayın ve ardından özellikler'e tıklayın. Web sekmesini seçin ve ardından Proje Url'si metin kutusundaki bağlantı noktası numarasını değiştirin.

SQL Server örneği bulma hatası

Hata İletisi:

SQL Server ile bağlantı kurulmaya çalışılırken ağ ile ilişkili veya örneğe özgü bir hata oluştu. Sunucu bulunamadı veya erişilebilir değildi. Örnek adının doğru olduğundan ve SQL Server'ın uzak bağlantılara izin verecek şekilde yapılandırıldığından emin olun. (sağlayıcı: SQL Ağ Arabirimleri, hata: 26 - Belirtilen Sunucuyu/Örneği Bulma Hatası)

Çözüm

Bağlantı dizesini denetleyin. Veritabanını el ile sildiyseniz, yapı dizesindeki veritabanının adını değiştirin.

Kodu alma

Tamamlanan Projeyi İndir

Ek kaynaklar

Entity Framework kullanarak verilerle çalışma hakkında daha fazla bilgi için MSDN ve ASP.NET Veri Erişimi - Önerilen Kaynaklarsayfasındaki EF belgeleri sayfasına bakın.

Web uygulamanızı derledikten sonra dağıtma hakkında daha fazla bilgi için bkz. MSDN Kitaplığı'nda Web Dağıtımı - Önerilen Kaynaklar ASP.NET .

Kimlik doğrulaması ve yetkilendirme gibi MVC ile ilgili diğer konular hakkında bilgi için bkz. MVC - Önerilen Kaynaklar ASP.NET.

Sonraki adımlar

Bu öğreticide şunları yaptınız:

  • Gerçekleştirilen ham SQL sorguları
  • İzleme olmayan sorgular gerçekleştirildi
  • Veritabanına gönderilen sql sorguları incelendi

Ayrıca şunları da öğrendinsiniz:

  • Soyutlama katmanı oluşturma
  • Ara sunucu sınıfları
  • Otomatik değişiklik algılama
  • Otomatik doğrulama
  • Entity Framework Power Tools
  • Entity Framework kaynak kodu

Bu işlem, Entity Framework'ün bir ASP.NET MVC uygulamasında kullanılmasıyla ilgili bu öğretici dizisini tamamlar. Ef Database First hakkında bilgi edinmek istiyorsanız db first öğretici serisine bakın.