Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
por Tom Dykstra
Esta série de tutoriais baseia-se no aplicativo Web da Contoso University criado pela série de tutoriais Introdução à Estrutura de Entidades . Se você não concluiu os tutoriais anteriores, como ponto de partida para este tutorial, poderá baixar o aplicativo que 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 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 da versão 4 do Entity Framework e vincula-se 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 orientado a modelo
- Suporte a POCO.
Além disso, o tutorial apresentará brevemente o desenvolvimento do code-first, um recurso que será disponibilizado 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 colunas CourseID e StudentID da tabela StudentGrade seriam omitidas da entidade StudentGrade.
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 as chaves estrangeiras no modelo de dados podem simplificar seu código, considere como você teria que codificar a página DepartmentsAdd.aspx sem elas. Na entidade Department, a propriedade Administrator é uma chave estrangeira que corresponde a PersonID na entidade Person. 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 databound:
protected void DepartmentsDetailsView_ItemInserting(object sender, DetailsViewInsertEventArgs e)
{
e.Values["Administrator"] = administratorsDropDownList.SelectedValue;
}
Sem chaves estrangeiras no modelo de dados, você lidaria com o Inserting evento do controle da origem de dados em vez do ItemInserting evento do controle de dados vinculados, para obter uma referência à entidade antes que ela seja adicionada ao conjunto de entidades. Quando você tem essa referência, estabelece 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 no 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, você está usando associações de chave estrangeira e, se excluir chaves estrangeiras, está usando associações independentes.
Executando Comandos SQL Definidos pelo Usuário
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ê teve que criar um procedimento armazenado e importá-lo como uma função. A versão 4 adiciona ExecuteStoreQuery e ExecuteStoreCommand 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 que eles alterem o número de créditos para todos os cursos no banco de dados. Na página da Web, eles querem poder inserir um número a ser usado para multiplicar o valor de cada linha na coluna de CourseCredits.
Crie uma nova página que use a página mestra Site.Master e nomeie-a 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 do 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.
Execute UpdateCredits.aspx, insira "10" como o multiplicador e clique em Executar.
Execute a página Courses.aspx novamente para ver os dados alterados.
(Se você quiser definir o número de créditos de volta para seus valores originais, em UpdateCredits.aspx.cs altere Credits * {0}Credits / {0} e execute novamente a página, inserindo 10 como 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 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á-lo do modelo não será mais prático; nesse ponto, você estará de volta à abordagem de banco de dados primeiro.)
Nesta seção do tutorial, você criará um modelo de dados simples e gerará o banco de dados dele.
No 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.
Isso inicia o Assistente de Modelo de Dados de Entidade. Na etapa Escolher Conteúdo do Modelo , selecione Modelo Vazio e clique em Concluir.
O Designer de Modelo de Dados de Entidade abre-se com uma superfície de design em branco. Arraste um item de entidade da caixa de ferramentas para a superfície de design.
Altere o nome da entidade de Entity1 para Alumnus, altere o nome da propriedade Id para AlumnusId e adicione uma nova propriedade escalar chamada Name. Para adicionar novas propriedades, você pode pressionar Enter depois de alterar o nome da Id coluna ou clicar com o botão direito do mouse na entidade e selecionar 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 o tipo de dados na janela Propriedades .
Crie outra entidade da mesma maneira e nomeie-a Donation. Altere a propriedade Id para DonationId e adicione uma propriedade escalar chamada DateAndAmount.
Para adicionar uma associação entre essas duas entidades, clique com o botão direito do mouse na Alumnus entidade, selecione Adicionar e selecione Associação.
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.
O designer adiciona uma linha de associação e uma propriedade de chave estrangeira.
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.
Isso inicia o Assistente de Geração de Banco de Dados. (Se você vir avisos que indicam que as entidades não estão mapeadas, você pode ignorá-las por enquanto.)
Na etapa Escolher Sua Conexão de Dados , clique em Nova Conexão.
Na caixa de diálogo Propriedades da Conexão , selecione a instância do SQL Server Express local e nomeie o banco de dados AlumniAssociation.
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.
Um arquivo .sql com os comandos DDL (linguagem de definição de dados) é criado, mas os comandos ainda não foram executados.
Use uma ferramenta como o SQL Server Management Studio para executar o script e criar as tabelas, como você pode ter feito ao criar o School banco de dados para o primeiro tutorial da série de tutoriais 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 exibe os dados.
Usando o Gerenciador de Servidores, adicione as seguintes linhas às tabelas Alumnus e Donation.
Crie uma nova página da Web chamada Alumni.aspx que usa a página mestra 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 GridView controle externoRowDataBound:
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 associa o controle interno GridView usando a Donations propriedade de navegação da entidade da Alumnus linha atual.
Execute a página.
(Observação: esta página está incluída no projeto para download, mas para que funcione, você deve criar o banco de dados em sua instância local do SQL Server Express; 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 porque 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 apresenta 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 e antigos (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 pela Entity Framework.
Para obter mais informações sobre como usar POCOs no Entity Framework, consulte os seguintes recursos:
- Trabalhando com entidades POCO. Este é um documento MSDN que é uma visão geral dos POCOs, com links para outros documentos que têm informações mais detalhadas.
- Passo a passo: modelo POCO para o Entity Framework Esta é uma postagem no blog da equipe de desenvolvimento do Entity Framework, com links para outras postagens de blog sobre POCOs.
Desenvolvimento 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 de código-primeiro. 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 do modelo de dados. (Portanto, essa opção também foi chamada de code-only; code-first e code-only ambos referem-se ao mesmo recurso do Entity Framework.)
Para obter mais informações sobre como usar a abordagem code-first para desenvolvimento, consulte os seguintes recursos:
- Desenvolvimento Code-First com o Entity Framework 4. Esta é uma postagem no blog de Scott Guthrie introduzindo o desenvolvimento baseado em código.
- Blog da Equipe de Desenvolvimento do Entity Framework – postagens marcadas CodeOnly
- Blog da Equipe de Desenvolvimento do Entity Framework – postagens marcadas Code First
- Tutorial do MVC Music Store – Parte 4: Modelos e Acesso a Dados
- Introdução ao MVC 3 – Parte 4: Entity Framework Code-First Development
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 nesta série de tutoriais sobre o 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:
- Novidades no ADO.NET Tópico msdn sobre novos recursos na versão 4 do Entity Framework.
- Anunciando a versão do Entity Framework 4 A postagem no blog da equipe de desenvolvimento do Entity Framework sobre novos recursos na versão 4.