Co nowego w programie Entity Framework 4.0
Autor : Tom Dykstra
Ta seria samouczków opiera się na aplikacji internetowej Contoso University utworzonej przez Wprowadzenie z serii samouczków platformy Entity Framework. Jeśli nie ukończysz wcześniejszych samouczków, jako punkt wyjścia dla tego samouczka możesz pobrać utworzoną aplikację . Możesz również pobrać aplikację utworzoną przez kompletną serię samouczków. Jeśli masz pytania dotyczące samouczków, możesz opublikować je na forum ASP.NET Entity Framework.
W poprzednim samouczku przedstawiono niektóre metody maksymalizacji wydajności aplikacji internetowej korzystającej z programu Entity Framework. W tym samouczku przedstawiono niektóre z najważniejszych nowych funkcji w wersji 4 programu Entity Framework i linki do zasobów, które zapewniają bardziej kompletne wprowadzenie do wszystkich nowych funkcji. Funkcje wyróżnione w tym samouczku obejmują następujące elementy:
- Skojarzenia klucza obcego.
- Wykonywanie poleceń SQL zdefiniowanych przez użytkownika.
- Tworzenie aplikacji opartych na modelu.
- Obsługa funkcji POCO.
Ponadto samouczek będzie krótko wprowadzać programowanie oparte na kodzie— funkcję, która będzie dostępna w następnej wersji programu Entity Framework.
Aby rozpocząć samouczek, uruchom program Visual Studio i otwórz aplikację internetową Contoso University, z którą pracujesz w poprzednim samouczku.
skojarzenia Foreign-Key
Wersja 3.5 programu Entity Framework zawierała właściwości nawigacji, ale nie zawierała właściwości klucza obcego w modelu danych. Na przykład kolumny CourseID
StudentGrade
i StudentID
tabeli zostaną pominięte z StudentGrade
jednostki.
Przyczyną tego podejścia było to, że ściśle mówiąc klucze obce są szczegółami implementacji fizycznej i nie należą do koncepcyjnego modelu danych. Jednak w praktyce często łatwiej jest pracować z jednostkami w kodzie, gdy masz bezpośredni dostęp do kluczy obcych.
Przykład sposobu, w jaki klucze obce w modelu danych może uprościć kod, rozważ sposób kodowania strony DepartmentsAdd.aspx bez nich. W jednostce Department
Administrator
właściwość jest kluczem obcym odpowiadającym PersonID
jednostce Person
. Aby ustanowić skojarzenie między nowym działem a jego administratorem, wystarczy ustawić wartość właściwości Administrator
w ItemInserting
procedurze obsługi zdarzeń kontrolki ruchu przychodzącego:
protected void DepartmentsDetailsView_ItemInserting(object sender, DetailsViewInsertEventArgs e)
{
e.Values["Administrator"] = administratorsDropDownList.SelectedValue;
}
Bez kluczy obcych w modelu danych będziesz obsługiwać Inserting
zdarzenie kontroli źródła danych zamiast ItemInserting
zdarzenia kontrolki ruchu przychodzącego, aby uzyskać odwołanie do samej jednostki przed dodaniu jednostki do zestawu jednostek. Jeśli masz to odwołanie, należy ustanowić skojarzenie przy użyciu kodu w następujący sposób w następujących przykładach:
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));
Jak widać w wpisie zespołu entity framework w blogu dotyczącym skojarzeń klucza obcego, istnieją inne przypadki, w których różnica w złożoności kodu jest znacznie większa. Aby spełnić potrzeby tych, którzy wolą żyć ze szczegółami implementacji w koncepcyjnym modelu danych ze względu na prostszy kod, platforma Entity Framework udostępnia teraz możliwość dołączania kluczy obcych w modelu danych.
W terminologii platformy Entity Framework, jeśli w modelu danych używasz skojarzeń kluczy obcych, a jeśli wykluczasz klucze obce, używasz niezależnych skojarzeń.
Wykonywanie poleceń User-Defined SQL
We wcześniejszych wersjach programu Entity Framework nie było łatwego sposobu tworzenia własnych poleceń SQL na bieżąco i ich uruchamiania. Program Entity Framework dynamicznie wygenerował polecenia SQL lub trzeba było utworzyć procedurę składowaną i zaimportować ją jako funkcję. Wersja 4 dodaje ExecuteStoreQuery
klasę ObjectContext
i ExecuteStoreCommand
metody, które ułatwiają przekazywanie zapytań bezpośrednio do bazy danych.
Załóżmy, że administratorzy firmy Contoso University chcą mieć możliwość przeprowadzania zbiorczych zmian w bazie danych bez konieczności wykonywania procesu tworzenia procedury składowanej i importowania jej do modelu danych. Ich pierwsze żądanie dotyczy strony, która pozwala im zmienić liczbę środków dla wszystkich kursów w bazie danych. Na stronie internetowej chcą mieć możliwość wprowadzenia liczby do użycia w celu pomnożenia wartości kolumny Credits
każdego Course
wiersza.
Utwórz nową stronę używającą strony wzorcowej Site.Master i nadaj jej nazwę UpdateCredits.aspx. Następnie dodaj następujący znacznik do kontrolki Content
o nazwie Content2
:
<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 />
Ten znacznik tworzy kontrolkę TextBox
, w której użytkownik może wprowadzić wartość mnożnika, kontrolkę do Button
kliknięcia w celu wykonania polecenia oraz kontrolkę wskazującą Label
liczbę wierszy, których dotyczy problem.
Otwórz plik UpdateCredits.aspx.cs i dodaj następującą using
instrukcję oraz procedurę obsługi zdarzenia przycisku Click
:
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();
}
}
Ten kod wykonuje polecenie SQL Update
przy użyciu wartości w polu tekstowym i używa etykiety do wyświetlenia liczby wierszy, których dotyczy problem. Przed uruchomieniem strony uruchom stronę Courses.aspx , aby uzyskać obraz "przed" niektórymi danymi.
Uruchom polecenie UpdateCredits.aspx, wprowadź wartość "10" jako mnożnik, a następnie kliknij przycisk Wykonaj.
Uruchom ponownie stronę Courses.aspx , aby wyświetlić zmienione dane.
(Jeśli chcesz ustawić liczbę środków z powrotem na oryginalne wartości, w pliku UpdateCredits.aspx.cs zmień Credits * {0}
na Credits / {0}
i ponownie uruchom stronę, wprowadzając 10 jako dzielnika).
Aby uzyskać więcej informacji na temat wykonywania zapytań zdefiniowanych w kodzie, zobacz Instrukcje: Bezpośrednie wykonywanie poleceń względem źródła danych.
programowanie Model-First
W tych przewodnikach najpierw utworzono bazę danych, a następnie wygenerowano model danych na podstawie struktury bazy danych. W programie Entity Framework 4 możesz zacząć od modelu danych i wygenerować bazę danych na podstawie struktury modelu danych. Jeśli tworzysz aplikację, dla której baza danych jeszcze nie istnieje, podejście oparte na modelu umożliwia tworzenie jednostek i relacji, które mają sens koncepcyjnie dla aplikacji, a jednocześnie nie martwi się o szczegóły implementacji fizycznej. (Pozostaje to prawdą tylko przez początkowe etapy rozwoju, jednak. W końcu baza danych zostanie utworzona i będzie miała w niej dane produkcyjne, a ponowne utworzenie jej z modelu nie będzie już praktyczne; w tym momencie wrócisz do podejścia opartego na bazie danych).
W tej sekcji samouczka utworzysz prosty model danych i wygenerujesz na jego podstawie bazę danych.
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy folder DAL i wybierz pozycję Dodaj nowy element. W oknie dialogowym Dodawanie nowego elementu w obszarze Zainstalowane szablony wybierz pozycję Dane , a następnie wybierz szablon modelu danych jednostki ADO.NET . Nadaj nowemu plikowi nazwę AlumniAssociationModel.edmx i kliknij przycisk Dodaj.
Spowoduje to uruchomienie Kreatora modelu danych jednostek. W kroku Wybieranie zawartości modelu wybierz pozycję Pusty model , a następnie kliknij przycisk Zakończ.
Model danych jednostki Projektant zostanie otwarty z pustą powierzchnią projektową. Przeciągnij element Entity (Jednostka ) z przybornika na powierzchnię projektową.
Zmień nazwę jednostki z na Entity1
Alumnus
, zmień Id
nazwę właściwości na AlumnusId
, a następnie dodaj nową właściwość skalarną o nazwie Name
. Aby dodać nowe właściwości, możesz nacisnąć klawisz Enter po zmianie nazwy Id
kolumny lub kliknąć prawym przyciskiem myszy jednostkę i wybrać pozycję Dodaj właściwość skalarną. Domyślnym typem nowych właściwości jest String
, który jest odpowiedni dla tej prostej demonstracji, ale oczywiście można zmienić takie rzeczy jak typ danych w oknie Właściwości .
Utwórz inną jednostkę w taki sam sposób i nadaj jej Donation
nazwę . Id
Zmień właściwość na DonationId
i dodaj właściwość skalarną o nazwie DateAndAmount
.
Aby dodać skojarzenie między tymi dwiema jednostkami, kliknij prawym przyciskiem myszy Alumnus
jednostkę, wybierz pozycję Dodaj, a następnie wybierz pozycję Skojarzenie.
Wartości domyślne w oknie dialogowym Dodawanie skojarzenia to, co chcesz (jeden do wielu, obejmują właściwości nawigacji, dołącz klucze obce), więc po prostu kliknij przycisk OK.
Projektant dodaje wiersz skojarzenia i właściwość klucza obcego.
Teraz możesz przystąpić do tworzenia bazy danych. Kliknij prawym przyciskiem myszy powierzchnię projektową i wybierz pozycję Generuj bazę danych z modelu.
Spowoduje to uruchomienie Kreatora generowania bazy danych. (Jeśli zostaną wyświetlone ostrzeżenia wskazujące, że jednostki nie są mapowane, możesz je zignorować na razie).
W kroku Wybierz połączenie danych kliknij pozycję Nowe połączenie.
W oknie dialogowym Właściwości połączenia wybierz lokalne wystąpienie SQL Server Express i nadaj bazie danych AlumniAssociation
nazwę .
Po wyświetleniu monitu kliknij przycisk Tak , jeśli chcesz utworzyć bazę danych. Gdy ponownie zostanie wyświetlony krok Wybierz połączenie danych , kliknij przycisk Dalej.
W kroku Podsumowanie i ustawienia kliknij przycisk Zakończ.
Tworzony jest plik SQL z poleceniami języka definicji danych (DDL), ale polecenia nie zostały jeszcze uruchomione.
Użyj narzędzia, takiego jak SQL Server Management Studio, aby uruchomić skrypt i utworzyć tabele, tak jak w przypadku utworzenia School
bazy danych na potrzeby pierwszego samouczka w serii samouczków Wprowadzenie. (Chyba że pobrano bazę danych).
Teraz możesz użyć AlumniAssociation
modelu danych na stronach internetowych tak samo jak w przypadku korzystania z School
modelu. Aby to wypróbować, dodaj dane do tabel i utwórz stronę internetową, która wyświetla dane.
Za pomocą Eksploratora serwera dodaj następujące wiersze do Alumnus
tabel i Donation
.
Utwórz nową stronę sieci Web o nazwie Alumni.aspx , która używa strony wzorcowej Site.Master . Dodaj następujące znaczniki do kontrolki Content
o nazwie Content2
:
<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>
Ten znacznik tworzy zagnieżdżone GridView
kontrolki, zewnętrzne, aby wyświetlić nazwiska absolwentów i wewnętrzne, aby wyświetlić daty i kwoty darowizny.
Otwórz plik Alumni.aspx.cs. Dodaj instrukcję using
dla warstwy dostępu do danych i procedurę obsługi zdarzenia kontroli zewnętrznej GridView
RowDataBound
:
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();
}
}
Ten kod tworzy powiązanie wewnętrznej GridView
kontrolki przy użyciu Donations
właściwości nawigacji jednostki bieżącego wiersza Alumnus
.
Uruchom stronę.
(Uwaga: ta strona jest zawarta w projekcie do pobrania, ale aby działała, należy utworzyć bazę danych w lokalnym wystąpieniu SQL Server Express; baza danych nie jest dołączona jako plik mdf w folderze App_Data).
Aby uzyskać więcej informacji na temat korzystania z funkcji opartej na modelu platformy Entity Framework, zobacz Model-First w programie Entity Framework 4.
Obsługa obiektów POCO
W przypadku korzystania z metodologii projektowania opartej na domenach klasy danych reprezentujące dane i zachowanie, które są istotne dla domeny biznesowej. Te klasy powinny być niezależne od każdej konkretnej technologii używanej do przechowywania (utrwalania) danych; innymi słowy, powinny one być wytrwałości ignorant. Niewiedza trwałości może również ułatwić test jednostkowy klasy, ponieważ projekt testu jednostkowego może korzystać z dowolnej technologii trwałości, która jest najwygodniejsza do testowania. Wcześniejsze wersje programu Entity Framework oferowały ograniczoną obsługę ignorancji trwałości, ponieważ klasy jednostek musiały dziedziczyć po EntityObject
klasie, a tym samym obejmowały wiele funkcji specyficznych dla programu Entity Framework.
Program Entity Framework 4 wprowadza możliwość używania klas jednostek, które nie dziedziczą po EntityObject
klasie i dlatego są ignorowane trwałości. W kontekście programu Entity Framework klasy takie jak te są zwykle nazywane zwykłymi obiektami CLR (POCO lub POCO). Klasy POCO można pisać ręcznie lub automatycznie wygenerować je na podstawie istniejącego modelu danych przy użyciu szablonów zestawu narzędzi przekształcania szablonów szablonów tekstu (T4) udostępnianych przez platformę Entity Framework.
Aby uzyskać więcej informacji na temat korzystania z obiektów POCO w programie Entity Framework, zobacz następujące zasoby:
- Praca z jednostkami POCO. Jest to dokument MSDN, który jest omówieniem obiektów weryfikacji koncepcji z linkami do innych dokumentów, które zawierają bardziej szczegółowe informacje.
- Przewodnik: szablon POCO dla platformy Entity Framework Jest to wpis w blogu od zespołu deweloperów platformy Entity Framework z linkami do innych wpisów w blogu dotyczących poCO.
programowanie Code-First
Obsługa modelu POCO w programie Entity Framework 4 nadal wymaga utworzenia modelu danych i połączenia klas jednostek z modelem danych. Następna wersja programu Entity Framework będzie zawierać funkcję o nazwie programowanie oparte na kodzie. Ta funkcja umożliwia korzystanie z platformy Entity Framework z własnymi klasami POCO bez konieczności używania projektanta modelu danych lub pliku XML modelu danych. (W związku z tym ta opcja jest również nazywana tylko kodem; zarówno code-first , jak i code-only odwołują się do tej samej funkcji programu Entity Framework.
Aby uzyskać więcej informacji na temat korzystania z podejścia opartego na kodzie do programowania, zobacz następujące zasoby:
- Programowanie code-first za pomocą programu Entity Framework 4. Jest to wpis w blogu Scott Guthrie wprowadzający programowanie code-first.
- Blog zespołu deweloperów platformy Entity Framework — wpisy oznaczone tagiem CodeOnly
- Blog zespołu deweloperów platformy Entity Framework — wpisy oznaczone tagiem Code First
- Samouczek mvC Music Store — część 4: modele i dostęp do danych
- Wprowadzenie za pomocą wzorca MVC 3 — część 4: Programowanie w programie Entity Framework Code-First
Ponadto nowy samouczek MVC Code-First, który kompiluje aplikację podobną do aplikacji Contoso University, ma zostać opublikowany wiosną 2011 r. https://asp.net/entity-framework/tutorials
Więcej informacji
Spowoduje to ukończenie przeglądu nowości w programie Entity Framework i serii samouczków Kontynuacja w programie Entity Framework. Aby uzyskać więcej informacji na temat nowych funkcji w programie Entity Framework 4, które nie zostały omówione tutaj, zobacz następujące zasoby:
- Co nowego w usłudze ADO.NET Temat MSDN dotyczący nowych funkcji w wersji 4 programu Entity Framework.
- Ogłoszenie wydania programu Entity Framework 4 Wpis w blogu zespołu deweloperów programu Entity Framework dotyczący nowych funkcji w wersji 4.