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.
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ı Content2
denetime 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.
UpdateCredits.aspx dosyasını çalıştırın, çarpan olarak "10" yazın ve Yürüt'e tıklayın.
Değiştirilen verileri görmek için Courses.aspx sayfasını yeniden çalıştırın.
(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.
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.
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.
varlık adını Entity1
Alumnus
olarak değiştirin, özellik adını olarak AlumnusId
değiştirin Id
ve adlı Name
yeni 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ü , String
bu 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 Id
DonationId
değiştirin ve adlı DateAndAmount
bir skaler özellik ekleyin.
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.
İ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.
Tasarımcı bir ilişkilendirme satırı ve bir yabancı anahtar özelliği ekler.
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.
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.
Bağlantı Özellikleri iletişim kutusunda yerel SQL Server Express örneğini seçin ve veritabanını AlumniAssociation
adlandırın.
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.
Veri tanımı dili (DDL) komutlarını içeren bir .sql dosyası oluşturulur, ancak komutlar henüz çalıştırılmadı.
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 AlumniAssociation
School
. 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.
Site.Master ana sayfasını kullanan Alumni.aspx adlı yeni bir web sayfası oluşturun. adlı Content2
denetime 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.
(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:
- POCO Varlıkları ile çalışma. Bu, POCO'lara genel bakış sağlayan ve daha ayrıntılı bilgi içeren diğer belgelerin bağlantılarını içeren bir MSDN belgesidir.
- İzlenecek yol: Entity Framework için POCO Şablonu Bu, Entity Framework geliştirme ekibinin POCO'larla ilgili diğer blog gönderilerinin bağlantılarını içeren bir blog gönderisidir.
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:
- Entity Framework 4 ile Kod öncelikli geliştirme. Bu, Scott Guthrie'nin kod öncelikli geliştirmeyi tanıtan bir blog gönderisi.
- Entity Framework Geliştirme Ekibi Blogu - CodeOnly olarak etiketlenmiş gönderiler
- Entity Framework Geliştirme Ekibi Blogu - Code First olarak etiketlenmiş gönderiler
- MVC Müzik Deposu öğreticisi - Bölüm 4: Modeller ve Veri Erişimi
- MVC 3 ile Çalışmaya Başlama - Bölüm 4: Entity Framework Code-First Geliştirme
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:
- ADO.NET'daki Yenilikler Entity Framework'ün 4. sürümündeki yeni özelliklerle ilgili MSDN konusu.
- Entity Framework 4'ün kullanıma sunuluyor Entity Framework geliştirme ekibinin sürüm 4'teki yeni özellikler hakkında blog gönderisi.