Novidades no Entity Framework 4.0

por Tom Dykstra

Esta série de tutoriais se baseia no aplicativo Web da Contoso University criado pelo Introdução com a série de tutoriais do Entity Framework. Se você não concluiu os tutoriais anteriores, como ponto de partida para este tutorial, poderá baixar o aplicativo que você teria criado. Você também pode baixar o aplicativo criado pela série de tutoriais completa. Se você tiver dúvidas sobre os tutoriais, poderá postá-los no fórum do ASP.NET Entity Framework.

No tutorial anterior, você viu alguns métodos para maximizar o desempenho de um aplicativo Web que usa o Entity Framework. Este tutorial analisa alguns dos novos recursos mais importantes na versão 4 do Entity Framework e se vincula a recursos que fornecem uma introdução mais completa a todos os novos recursos. Os recursos realçados neste tutorial incluem o seguinte:

  • Associações de chave estrangeira.
  • Executando comandos SQL definidos pelo usuário.
  • Desenvolvimento de primeiro modelo.
  • Suporte a POCO.

Além disso, o tutorial apresentará brevemente o desenvolvimento de code-first, um recurso que virá na próxima versão do Entity Framework.

Para iniciar o tutorial, inicie o Visual Studio e abra o aplicativo Web da Contoso University com o qual você estava trabalhando no tutorial anterior.

Associações de Foreign-Key

A versão 3.5 do Entity Framework incluía propriedades de navegação, mas não incluía propriedades de chave estrangeira no modelo de dados. Por exemplo, as CourseID colunas e StudentID da StudentGrade tabela seriam omitidas da StudentGrade entidade.

Image01

O motivo dessa abordagem foi que, estritamente falando, as chaves estrangeiras são um detalhe de implementação física e não pertencem a um modelo de dados conceitual. No entanto, como uma questão prática, geralmente é mais fácil trabalhar com entidades no código quando você tem acesso direto às chaves estrangeiras.

Para obter um exemplo de como chaves estrangeiras no modelo de dados podem simplificar seu código, considere como você teria que codificar a página DepartmentsAdd.aspx sem elas . Department Na entidade , a Administrator propriedade é uma chave estrangeira que corresponde à PersonIDPerson entidade . Para estabelecer a associação entre um novo departamento e seu administrador, tudo o que você precisava fazer era definir o valor da Administrator propriedade no ItemInserting manipulador de eventos do controle de entrada de dados:

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

Sem chaves estrangeiras no modelo de dados, você manipularia o Inserting evento do controle da fonte de dados em vez do ItemInserting evento do controle de entrada de dados, a fim de obter uma referência à própria entidade antes que a entidade seja adicionada ao conjunto de entidades. Quando você tiver essa referência, estabelecerá a associação usando um código como esse nos seguintes exemplos:

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));

Como você pode ver na postagem de blog da equipe do Entity Framework sobre associações de Chave Estrangeira, há outros casos em que a diferença na complexidade do código é muito maior. Para atender às necessidades daqueles que preferem viver com detalhes de implementação no modelo de dados conceitual para fins de código mais simples, o Entity Framework agora oferece a opção de incluir chaves estrangeiras no modelo de dados.

Na terminologia do Entity Framework, se você incluir chaves estrangeiras no modelo de dados, está usando associações de chave estrangeira e, se excluir chaves estrangeiras, está usando associações independentes.

Executando User-Defined comandos SQL

Em versões anteriores do Entity Framework, não havia uma maneira fácil de criar seus próprios comandos SQL em tempo real e executá-los. O Entity Framework gerou dinamicamente comandos SQL para você ou você precisou criar um procedimento armazenado e importá-lo como uma função. A versão 4 adiciona ExecuteStoreQuery e ExecuteStoreCommand os métodos da ObjectContext classe que facilitam a passagem de qualquer consulta diretamente para o banco de dados.

Suponha que os administradores da Contoso University queiram realizar alterações em massa no banco de dados sem precisar passar pelo processo de criação de um procedimento armazenado e importá-lo para o modelo de dados. Sua primeira solicitação é para uma página que permite alterar o número de créditos para todos os cursos no banco de dados. Na página da Web, eles desejam poder inserir um número a ser usado para multiplicar o valor da coluna de Credits cada Course linha.

Crie uma nova página que use a página master Site.Master e nomeie-a como UpdateCredits.aspx. Em seguida, adicione a seguinte marcação ao Content controle chamado 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 />

Essa marcação cria um TextBox controle no qual o usuário pode inserir o valor multiplicador, um Button controle para clicar para executar o comando e um Label controle para indicar o número de linhas afetadas.

Abra UpdateCredits.aspx.cs e adicione a seguinte using instrução e um manipulador para o evento do Click botão:

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();
    }
}

Esse código executa o comando SQL Update usando o valor na caixa de texto e usa o rótulo para exibir o número de linhas afetadas. Antes de executar a página, execute a página Courses.aspx para obter uma imagem "antes" de alguns dados.

Imagem02

Execute UpdateCredits.aspx, insira "10" como o multiplicador e clique em Executar.

Imagem03

Execute a página Courses.aspx novamente para ver os dados alterados.

Imagem04

(Se você quiser definir o número de créditos de volta para seus valores originais, em UpdateCredits.aspx.cs , altere Credits * {0} para Credits / {0} e execute novamente a página, inserindo 10 como o divisor.)

Para obter mais informações sobre como executar consultas que você define no código, consulte Como executar comandos diretamente na fonte de dados.

Desenvolvimento de Model-First

Nestes passo a passo, você criou o banco de dados primeiro e, em seguida, gerou o modelo de dados com base na estrutura do banco de dados. No Entity Framework 4, você pode começar com o modelo de dados e gerar o banco de dados com base na estrutura do modelo de dados. Se você estiver criando um aplicativo para o qual o banco de dados ainda não existe, a abordagem de primeiro modelo permitirá que você crie entidades e relações que façam sentido conceitualmente para o aplicativo, sem se preocupar com detalhes de implementação física. (No entanto, isso permanece verdadeiro apenas por meio dos estágios iniciais de desenvolvimento. Eventualmente, o banco de dados será criado e terá dados de produção e recriá-los do modelo não será mais prático; nesse ponto, você voltará à abordagem de banco de dados primeiro.)

Nesta seção do tutorial, você criará um modelo de dados simples e gerará o banco de dados com base nele.

Em Gerenciador de Soluções, clique com o botão direito do mouse na pasta DAL e selecione Adicionar Novo Item. Na caixa de diálogo Adicionar Novo Item , em Modelos Instalados , selecione Dados e, em seguida, selecione o modelo ADO.NET Modelo de Dados de Entidade . Nomeie o novo arquivo AlumniAssociationModel.edmx e clique em Adicionar.

Image06

Isso inicia o Assistente de Modelo de Dados de Entidade. Na etapa Escolher Conteúdo do Modelo , selecione Modelo Vazio e clique em Concluir.

Imagem07

O modelo de dados de entidade Designer é aberto com uma superfície de design em branco. Arraste um item de Entidade da Caixa de Ferramentas para a superfície de design.

Imagem08

Altere o nome da entidade de Entity1 para , altere o nome da Id propriedade para AlumnusIde adicione uma nova propriedade escalar chamada NameAlumnus. Para adicionar novas propriedades, pressione Enter depois de alterar o nome da Id coluna ou clique com o botão direito do mouse na entidade e selecione Adicionar Propriedade Escalar. O tipo padrão para novas propriedades é String, o que é bom para essa demonstração simples, mas é claro que você pode alterar coisas como tipo de dados na janela Propriedades .

Crie outra entidade da mesma maneira e nomeie-a Donationcomo . Altere a Id propriedade para DonationId e adicione uma propriedade escalar chamada DateAndAmount.

Imagem09

Para adicionar uma associação entre essas duas entidades, clique com o botão direito do mouse na Alumnus entidade, selecione Adicionar e, em seguida, selecione Associação.

Imagem10

Os valores padrão na caixa de diálogo Adicionar Associação são o que você deseja (um para muitos, incluir propriedades de navegação, incluir chaves estrangeiras), portanto, basta clicar em OK.

Image11

O designer adiciona uma linha de associação e uma propriedade de chave estrangeira.

Imagem12

Agora você está pronto para criar o banco de dados. Clique com o botão direito do mouse na superfície de design e selecione Gerar Banco de Dados do Modelo.

Imagem13

Isso inicia o Assistente para Gerar Banco de Dados. (Se você vir avisos que indicam que as entidades não estão mapeadas, poderá ignorá-las por enquanto.)

Na etapa Escolher Sua Conexão de Dados , clique em Nova Conexão.

Imagem14

Na caixa de diálogo Propriedades da Conexão, selecione a instância de SQL Server Express local e nomeie o banco de dados AlumniAssociationcomo .

Imagem15

Clique em Sim quando for perguntado se deseja criar o banco de dados. Quando a etapa Escolher Sua Conexão de Dados for exibida novamente, clique em Avançar.

Na etapa Resumo e Configurações , clique em Concluir.

Imagem18

Um arquivo .sql com os comandos DDL (linguagem de definição de dados) é criado, mas os comandos ainda não foram executados.

Imagem20

Use uma ferramenta como SQL Server Management Studio para executar o script e criar as tabelas, como você pode ter feito quando criou o School banco de dados para o primeiro tutorial na série de tutoriais do Introdução. (A menos que você tenha baixado o banco de dados.)

Agora você pode usar o AlumniAssociation modelo de dados em suas páginas da Web da mesma maneira que tem usado o School modelo. Para experimentar isso, adicione alguns dados às tabelas e crie uma página da Web que exiba os dados.

Usando o Explorer do Servidor, adicione as linhas a Alumnus seguir às tabelas e Donation .

Imagem21

Crie uma nova página da Web chamada Alumni.aspx que usa a página master Site.Master. Adicione a seguinte marcação ao Content controle chamado 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>

Essa marcação cria controles aninhados GridView , o externo para exibir nomes de ex-alunos e o interno para exibir datas e valores de doação.

Abra Alumni.aspx.cs. Adicione uma using instrução para a camada de acesso a dados e um manipulador para o evento do RowDataBound controle externoGridView:

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();
    }
}

Esse código vincula o controle interno GridView usando a Donations propriedade de navegação da entidade da Alumnus linha atual.

Execute a página.

Imagem22

(Observação: esta página está incluída no projeto baixável, mas para que funcione, você deve criar o banco de dados em sua instância de SQL Server Express local; o banco de dados não está incluído como um arquivo .mdf na pasta App_Data.)

Para obter mais informações sobre como usar o recurso de primeiro modelo do Entity Framework, consulte Model-First no Entity Framework 4.

Suporte para POCO

Ao usar a metodologia de design controlada pelo domínio, você cria classes de dados que representam dados e comportamento relevantes para o domínio de negócios. Essas classes devem ser independentes de qualquer tecnologia específica usada para armazenar (persistir) os dados; em outras palavras, eles devem ser ignorantes de persistência. A ignorância de persistência também pode facilitar o teste de unidade de uma classe, pois o projeto de teste de unidade pode usar qualquer tecnologia de persistência mais conveniente para teste. Versões anteriores do Entity Framework ofereciam suporte limitado para ignorância de persistência porque as classes de entidade tinham que herdar da EntityObject classe e, portanto, incluíam uma grande quantidade de funcionalidade específica do Entity Framework.

O Entity Framework 4 introduz a capacidade de usar classes de entidade que não herdam da EntityObject classe e, portanto, são ignorantes de persistência. No contexto do Entity Framework, classes como essa normalmente são chamadas de OBJETOS CLR simples (POCO ou POCOs). Você pode escrever classes POCO manualmente ou gerá-las automaticamente com base em um modelo de dados existente usando modelos T4 (Text Template Transformation Toolkit) fornecidos pelo Entity Framework.

Para obter mais informações sobre como usar POCOs no Entity Framework, consulte os seguintes recursos:

Desenvolvimento de Code-First

O suporte a POCO no Entity Framework 4 ainda requer que você crie um modelo de dados e vincule suas classes de entidade ao modelo de dados. A próxima versão do Entity Framework incluirá um recurso chamado desenvolvimento code-first. Esse recurso permite que você use o Entity Framework com suas próprias classes POCO sem precisar usar o designer de modelo de dados ou um arquivo XML de modelo de dados. (Portanto, essa opção também foi chamada de somente código; code-first e code-only referem-se ao mesmo recurso do Entity Framework.)

Para obter mais informações sobre como usar a abordagem code-first para o desenvolvimento, consulte os seguintes recursos:

Além disso, um novo tutorial do MVC Code-First que cria um aplicativo semelhante ao aplicativo da Contoso University é projetado para ser publicado na primavera de 2011 em https://asp.net/entity-framework/tutorials

Mais informações

Isso conclui a visão geral das novidades no Entity Framework e desta série de tutoriais Continuando com a Entity Framework. Para obter mais informações sobre novos recursos no Entity Framework 4 que não são abordados aqui, consulte os seguintes recursos: