Entity Framework 4.0 Sürümündeki Yenilikler

tarafından Tom Dykstra

Bu öğretici serisi , Entity Framework ile Çalışmaya Başlama öğretici serisi tarafından oluşturulan Contoso Üniversitesi web uygulamasını oluşturur. Önceki öğreticileri tamamlamadıysanız, bu öğreticinin başlangıç noktası olarak oluşturduğunuz uygulamayı indirebilirsiniz . Öğretici serisinin tamamı tarafından oluşturulan uygulamayı da indirebilirsiniz. Öğreticiler hakkında sorularınız varsa bunları ASP.NET Entity Framework forumu'na gönderebilirsiniz.

Önceki öğreticide Entity Framework kullanan bir web uygulamasının performansını en üst düzeye çıkarmak için bazı yöntemler gördünüz. Bu öğretici, Entity Framework'ün 4. sürümündeki en önemli yeni özelliklerden bazılarını inceler ve tüm yeni özelliklere daha eksiksiz bir giriş sağlayan kaynaklara bağlanır. Bu öğreticide vurgulanan özellikler şunlardır:

  • Yabancı anahtar ilişkilendirmeleri.
  • Kullanıcı tanımlı SQL komutlarını yürütme.
  • Model öncelikli geliştirme.
  • POCO desteği.

Ayrıca öğretici, Entity Framework'ün bir sonraki sürümünde kullanıma sunulacak olan kod öncelikli geliştirmeyi kısaca tanıtacaktır.

Öğreticiyi başlatmak için Visual Studio'yu başlatın ve önceki öğreticide üzerinde çalıştığınız Contoso University web uygulamasını açın.

Foreign-Key İlişkilendirmeleri

Entity Framework'ün 3.5 sürümü gezinti özelliklerini içeriyordu, ancak veri modelinde yabancı anahtar özellikleri içermiyordu. Örneğin, CourseID tablonun ve StudentID sütunları StudentGrade varlıktan StudentGrade atlanır.

Resim01

Bu yaklaşımın nedeni, yabancı anahtarların fiziksel bir uygulama ayrıntısı olması ve kavramsal veri modeline ait olmamalarıdır. Ancak, pratik bir konu olarak, yabancı anahtarlara doğrudan erişiminiz olduğunda koddaki varlıklarla çalışmak genellikle daha kolaydır.

Veri modelindeki yabancı anahtarların kodunuzu nasıl basitleştirebileceğine ilişkin bir örnek için , DepartmentsAdd.aspx sayfasını bunlar olmadan nasıl kodlamak zorunda kalabileceğinizi düşünün. varlığında Department özelliği, Administrator varlıktaki Person öğesine PersonID karşılık gelen bir yabancı anahtardır. Yeni bir departmanla yöneticisi arasında ilişki kurmak için tek yapmanız gereken veri giden denetiminin Administrator olay işleyicisindeki ItemInserting özelliğin değerini ayarlamaktı:

protected void DepartmentsDetailsView_ItemInserting(object sender, DetailsViewInsertEventArgs e)
{
    e.Values["Administrator"] = administratorsDropDownList.SelectedValue;
}

Veri modelinde yabancı anahtarlar olmadan, varlık varlık kümesine eklenmeden önce varlığın kendisine başvuru almak için veri bağlantısı denetiminin olayı yerine ItemInserting veri kaynağı denetiminin olayını işlersinizInserting. Bu başvuruya sahip olduğunuzda, aşağıdaki örneklerde bunun gibi bir kod kullanarak ilişkilendirmeyi kurarsınız:

departmentEntityToBeInserted.PersonReference.EntityKey = new System.Data.EntityKey("SchoolEntities.Departments", "PersonID", Convert.ToInt32(administratorsDropDownList.SelectedValue));
departmentEntityToBeInserted.Person = context.People.Single(p => p.PersonID == Convert.ToInt32(administratorsDropDownList.SelectedValue));

Entity Framework ekibinin Yabancı Anahtar ilişkilendirmeleriyle ilgili blog gönderisinde görebileceğiniz gibi, kod karmaşıklığındaki farkın çok daha fazla olduğu başka durumlar da vardır. Daha basit bir kod için kavramsal veri modelinde uygulama ayrıntılarıyla yaşamayı tercih edenlerin ihtiyaçlarını karşılamak için Entity Framework artık veri modeline yabancı anahtarlar ekleme seçeneği sunar.

Entity Framework terminolojisinde, veri modeline yabancı anahtarlar eklerseniz yabancı anahtar ilişkilendirmeleri kullanırsınız ve yabancı anahtarları dışlarsanız bağımsız ilişkilendirmeler kullanırsınız.

User-Defined SQL Komutlarını Yürütme

Entity Framework'ün önceki sürümlerinde, anında kendi SQL komutlarınızı oluşturmanın ve çalıştırmanın kolay bir yolu yoktu. Entity Framework sizin için dinamik olarak SQL komutları oluşturdu veya bir saklı yordam oluşturup işlev olarak içeri aktarmanız gerekti. Sürüm 4, herhangi bir sorguyu ObjectContext doğrudan veritabanına geçirmenizi kolaylaştıran sınıfını ekler ExecuteStoreQuery ve ExecuteStoreCommand yöntemler.

Contoso Üniversitesi yöneticilerinin bir saklı yordam oluşturma ve bunu veri modeline aktarma işleminden geçmek zorunda kalmadan veritabanında toplu değişiklikler yapabilmek istediklerini varsayalım. İlk istekleri, veritabanındaki tüm kurslar için kredi sayısını değiştirmelerine olanak tanıyan bir sayfaya yöneliktir. Web sayfasında, her Course satırın Credits sütununun değerini çarpmak için kullanılacak bir sayı girebilmek ister.

Site.Master ana sayfasını kullanan yeni bir sayfa oluşturun ve bunu UpdateCredits.aspx olarak adlandırın. Ardından adlı Content2denetime aşağıdaki işaretlemeyi Content ekleyin:

<h2>Update Credits</h2>
    Enter the number to multiply the current number of credits by: 
    <asp:TextBox ID="CreditsMultiplierTextBox" runat="server"></asp:TextBox>
    <br /><br />
    <asp:Button ID="ExecuteButton" runat="server" Text="Execute" OnClick="ExecuteButton_Click" /><br /><br />
    Rows affected:
    <asp:Label ID="RowsAffectedLabel" runat="server" Text="0" ViewStateMode="Disabled"></asp:Label><br /><br />

Bu işaretleme, kullanıcının çarpan değerini girebileceği bir TextBox denetim, komutu yürütmek için tıklanması gereken bir Button denetim ve etkilenen satır sayısını belirten bir Label denetim oluşturur.

UpdateCredits.aspx.cs dosyasını açın ve düğmenin Click olayı için aşağıdaki using deyimi ve işleyiciyi ekleyin:

using ContosoUniversity.DAL;
protected void ExecuteButton_Click(object sender, EventArgs e)
{
    using (SchoolEntities context = new SchoolEntities())
    {
        RowsAffectedLabel.Text = context.ExecuteStoreCommand("UPDATE Course SET Credits = Credits * {0}", CreditsMultiplierTextBox.Text).ToString();
    }
}

Bu kod, metin kutusundaki değeri kullanarak SQL Update komutunu yürütür ve etkilenen satır sayısını görüntülemek için etiketini kullanır. Sayfayı çalıştırmadan önce, bazı verilerin "önce" resmini almak için Courses.aspx sayfasını çalıştırın.

Görüntü02

UpdateCredits.aspx dosyasını çalıştırın, çarpan olarak "10" yazın ve Yürüt'e tıklayın.

Görüntü03

Değiştirilen verileri görmek için Courses.aspx sayfasını yeniden çalıştırın.

Görüntü04

(Kredi sayısını özgün değerlerine geri ayarlamak istiyorsanız, UpdateCredits.aspx.cs dosyasında sayfaya Credits / {0} geçin Credits * {0} ve sayfayı yeniden çalıştırın ve bölen olarak 10 girin.)

Kodda tanımladığınız sorguları yürütme hakkında daha fazla bilgi için bkz . Nasıl yapılır: Doğrudan Veri Kaynağında Komutları Yürütme.

Model-First Geliştirme

Bu kılavuzlarda önce veritabanını oluşturdunuz ve ardından veritabanı yapısını temel alan veri modelini oluşturdunuz. Entity Framework 4'te bunun yerine veri modeliyle başlayabilir ve veritabanını veri modeli yapısına göre oluşturabilirsiniz. Veritabanının henüz mevcut olmadığı bir uygulama oluşturuyorsanız model öncelikli yaklaşım, fiziksel uygulama ayrıntıları konusunda endişelenmeden uygulama için kavramsal olarak anlamlı varlıklar ve ilişkiler oluşturmanıza olanak tanır. (Ancak bu durum yalnızca geliştirmenin ilk aşamalarında geçerlidir. Sonunda veritabanı oluşturulacak ve içinde üretim verileri olacak ve modelden yeniden oluşturmak artık pratik olmayacaktır; bu noktada veritabanı öncelikli yaklaşıma dönersiniz.)

Öğreticinin bu bölümünde basit bir veri modeli oluşturacak ve veritabanını oluşturacaksınız.

Çözüm Gezginidal klasörüne sağ tıklayın ve Yeni Öğe Ekle'yi seçin. Yeni Öğe Ekle iletişim kutusunda, Yüklü Şablonlar'ın altında Veri'yi seçin ve ardından Varlık Veri Modeli şablonunu ADO.NET. Yeni dosyayı AlumniAssociationModel.edmx olarak adlandırın ve Ekle'ye tıklayın.

Görüntü06

Bu işlem Varlık Veri Modeli Sihirbazı'nı başlatır. Model İçeriği Seç adımında Modeli Boşalt'ı seçin ve son'a tıklayın.

Görüntü07

Varlık Veri Modeli Tasarım Aracı boş bir tasarım yüzeyiyle açılır. Araç Kutusundan bir Varlık öğesini tasarım yüzeyine sürükleyin.

Görüntü08

varlık adını Entity1Alumnusolarak değiştirin, özellik adını olarak AlumnusIddeğiştirin Id ve adlı Nameyeni bir skaler özellik ekleyin. Yeni özellikler eklemek için sütunun adını değiştirdikten sonra Enter tuşuna Id basabilir veya varlığa sağ tıklayıp Skaler Özellik Ekle'yi seçebilirsiniz. Yeni özelliklerin varsayılan türü , Stringbu basit gösterim için uygundur, ancak elbette Özellikler penceresinde veri türü gibi şeyleri değiştirebilirsiniz.

Aynı şekilde başka bir varlık oluşturun ve olarak adlandırın Donation. özelliğini olarak IdDonationId değiştirin ve adlı DateAndAmountbir skaler özellik ekleyin.

Görüntü09

Bu iki varlık arasına ilişkilendirme eklemek için varlığa sağ tıklayın Alumnus , Ekle'yi ve ardından İlişkilendirme'yi seçin.

Resim10

İlişkilendirme Ekle iletişim kutusundaki varsayılan değerler istediğiniz değerlerdir (bire çok, gezinti özelliklerini dahil et, yabancı anahtarları ekle), bu nedenle Tamam'a tıklamanız yeter.

Resim11

Tasarımcı bir ilişkilendirme satırı ve bir yabancı anahtar özelliği ekler.

Resim12

Artık veritabanını oluşturmaya hazırsınız. Tasarım yüzeyine sağ tıklayın ve Modelden Veritabanı Oluştur'a tıklayın.

Resim13

Bu işlem Veritabanı Oluşturma Sihirbazı'nı başlatır. (Varlıkların eşlenmediğini belirten uyarılar görürseniz, bunları şimdilik yoksayabilirsiniz.)

Veri Bağlantınızı Seçin adımında Yeni Bağlantı'ya tıklayın.

Resim14

Bağlantı Özellikleri iletişim kutusunda yerel SQL Server Express örneğini seçin ve veritabanını AlumniAssociationadlandırın.

Resim15

Veritabanını oluşturmak isteyip istemediğiniz sorulduğunda Evet'e tıklayın. Veri Bağlantınızı Seçin adımı yeniden görüntülendiğinde İleri'ye tıklayın.

Özet ve Ayarlar adımında Son'a tıklayın.

Resim18

Veri tanımı dili (DDL) komutlarını içeren bir .sql dosyası oluşturulur, ancak komutlar henüz çalıştırılmadı.

Resim20

Betiği çalıştırmak ve tabloları oluşturmak için SQL Server Management Studio gibi bir araç kullanın. Başlangıç öğreticisi serisindeki ilk öğretici için veritabanını oluştururken School yapmış olabileceğiniz gibi. (Veritabanını indirmediğiniz sürece.)

Artık veri modelini, modeli kullandığınız gibi web sayfalarınızda da kullanabilirsiniz AlumniAssociationSchool . Bunu denemek için tablolara veri ekleyin ve verileri görüntüleyen bir web sayfası oluşturun.

Sunucu Gezgini'ni kullanarak ve Donation tablolarına Alumnus aşağıdaki satırları ekleyin.

Resim21

Site.Master ana sayfasını kullanan Alumni.aspx adlı yeni bir web sayfası oluşturun. adlı Content2denetime aşağıdaki işaretlemeyi Content ekleyin:

<h2>Alumni</h2>
    <asp:EntityDataSource ID="AlumniEntityDataSource" runat="server" 
        ContextTypeName="ContosoUniversity.DAL.AlumniAssociationModelContainer" EnableFlattening="False" 
        EntitySetName="Alumni">
    </asp:EntityDataSource>
    <asp:GridView ID="AlumniGridView" runat="server" 
        DataSourceID="AlumniEntityDataSource" AutoGenerateColumns="False"
        OnRowDataBound="AlumniGridView_RowDataBound"
        DataKeyNames="AlumnusId">
        <Columns>
            <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
            <asp:TemplateField HeaderText="Donations">
                <ItemTemplate>
                    <asp:GridView ID="DonationsGridView" runat="server" AutoGenerateColumns="False">
                        <Columns>
                            <asp:BoundField DataField="DateAndAmount" HeaderText="Date and Amount" />
                        </Columns>
                    </asp:GridView>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

Bu işaretleme, mezun adlarını görüntülemek için dışta ve bağış tarihlerini ve tutarlarını görüntülemek için iç içe denetimler oluşturur GridView .

Alumni.aspx.cs dosyasını açın. Veri erişim katmanı için bir using deyim ve dış GridView denetimin RowDataBound olayı için bir işleyici ekleyin:

using ContosoUniversity.DAL; 

// ...

protected void AlumniGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var alumnus = e.Row.DataItem as Alumnus;
        var donationsGridView = (GridView)e.Row.FindControl("DonationsGridView");
        donationsGridView.DataSource = alumnus.Donations.ToList();
        donationsGridView.DataBind();
    }
}

Bu kod, geçerli satırın varlığının Donations gezinti özelliğini kullanarak iç GridView denetimin veri bağlamasını Alumnus sağlar.

Sayfayı çalıştırın.

Resim22

(Not: Bu sayfa indirilebilir projeye dahildir, ancak çalışmasını sağlamak için veritabanını yerel SQL Server Express örneğinizde oluşturmanız gerekir; veritabanı App_Data klasörüne .mdf dosyası olarak eklenmez.)

Entity Framework'ün model öncelikli özelliğini kullanma hakkında daha fazla bilgi için bkz. Entity Framework 4'te Model-First.

POCO Desteği

Etki alanı odaklı tasarım metodolojisini kullandığınızda, iş etki alanıyla ilgili verileri ve davranışı temsil eden veri sınıfları tasarlarsınız. Bu sınıflar, verileri depolamak (kalıcı hale getirmek) için kullanılan herhangi bir teknolojiden bağımsız olmalıdır; Başka bir deyişle, ısrarla cahil olmaları gerekir. Kalıcılık yoksayma, birim testi projesi test için en uygun olan kalıcılık teknolojisini kullanabileceğinden, bir sınıfın birim testini kolaylaştırabilmesini de sağlayabilir. Varlık sınıflarının sınıftan devralmaları gerektiğinden ve bu nedenle Entity Framework'e özgü işlevlerin büyük bir bölümünü içerdiğinden EntityObject , Entity Framework'ün önceki sürümleri kalıcılık yoksayma için sınırlı destek sunuyordu.

Entity Framework 4, sınıftan devralmayan EntityObject ve bu nedenle kalıcılık bilgisi olmayan varlık sınıflarını kullanma olanağı sağlar. Entity Framework bağlamında, bunun gibi sınıflar genellikle düz eski CLR nesneleri (POCO veya POCO) olarak adlandırılır. POCO sınıflarını el ile yazabilir veya Entity Framework tarafından sağlanan Metin Şablonu Dönüştürme Araç Seti (T4) şablonlarını kullanarak mevcut bir veri modeline göre otomatik olarak oluşturabilirsiniz.

Entity Framework'te POCO'ları kullanma hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:

Code-First Geliştirme

Entity Framework 4'teki POCO desteği, yine de bir veri modeli oluşturmanızı ve varlık sınıflarınızı veri modeline bağlamanızı gerektirir. Entity Framework'ün bir sonraki sürümünde kod öncelikli geliştirme adlı bir özellik yer alacaktır. Bu özellik, veri modeli tasarımcısını veya veri modeli XML dosyasını kullanmanıza gerek kalmadan Entity Framework'ünüzü kendi POCO sınıflarınızla kullanmanıza olanak tanır. (Bu nedenle, bu seçenek yalnızca kod olarak da adlandırılır; kod öncelikli ve yalnızca kod olan her ikisi de aynı Entity Framework özelliğine başvurur.)

Geliştirme için kod öncelikli yaklaşımı kullanma hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:

Ayrıca Contoso Üniversitesi uygulamasına benzer bir uygulama oluşturan yeni bir MVC Code-First öğreticisinin 2011 baharında https://asp.net/entity-framework/tutorials

Daha Fazla Bilgi

Bu, Entity Framework'teki yeniliklere genel bakış ve Entity Framework ile Devam Etme öğretici serisini tamamlar. Entity Framework 4'te yer almayan yeni özellikler hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın: