Udostępnij za pośrednictwem


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 CourseIDStudentGrade i StudentID tabeli zostaną pominięte z StudentGrade jednostki.

Obraz01

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 DepartmentAdministrator 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.

Obraz02

Uruchom polecenie UpdateCredits.aspx, wprowadź wartość "10" jako mnożnik, a następnie kliknij przycisk Wykonaj.

Obraz03

Uruchom ponownie stronę Courses.aspx , aby wyświetlić zmienione dane.

Obraz04

(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.

Obraz06

Spowoduje to uruchomienie Kreatora modelu danych jednostek. W kroku Wybieranie zawartości modelu wybierz pozycję Pusty model , a następnie kliknij przycisk Zakończ.

Obraz07

Model danych jednostki Projektant zostanie otwarty z pustą powierzchnią projektową. Przeciągnij element Entity (Jednostka ) z przybornika na powierzchnię projektową.

Obraz08

Zmień nazwę jednostki z na Entity1Alumnus, 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 Donationnazwę . Id Zmień właściwość na DonationId i dodaj właściwość skalarną o nazwie DateAndAmount.

Obraz09

Aby dodać skojarzenie między tymi dwiema jednostkami, kliknij prawym przyciskiem myszy Alumnus jednostkę, wybierz pozycję Dodaj, a następnie wybierz pozycję Skojarzenie.

Obraz10

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.

Obraz11

Projektant dodaje wiersz skojarzenia i właściwość klucza obcego.

Obraz12

Teraz możesz przystąpić do tworzenia bazy danych. Kliknij prawym przyciskiem myszy powierzchnię projektową i wybierz pozycję Generuj bazę danych z modelu.

Obraz13

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.

Obraz14

W oknie dialogowym Właściwości połączenia wybierz lokalne wystąpienie SQL Server Express i nadaj bazie danych AlumniAssociationnazwę .

Obraz15

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.

Obraz18

Tworzony jest plik SQL z poleceniami języka definicji danych (DDL), ale polecenia nie zostały jeszcze uruchomione.

Obraz20

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 .

Obraz 21

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 GridViewRowDataBound :

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ę.

Obraz22

(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:

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:

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: