Partilhar via


Começar com Entity Framework 4.0 Base de Dados Primeiro e ASP.NET 4 Formulários Web - Parte 6

por Tom Dykstra

A aplicação web de exemplo da Universidade Contoso demonstra como criar ASP.NET aplicações Web Forms usando o Entity Framework 4.0 e o Visual Studio 2010. Para informações sobre a série de tutoriais, consulte o primeiro tutorial da série

Implementação da Herança de Tabela por Hierarquia

No tutorial anterior, trabalhaste com dados relacionados adicionando e eliminando relações e adicionando uma nova entidade que tinha uma relação com uma entidade existente. Este tutorial vai mostrar-te como implementar a herança no modelo de dados.

Na programação orientada a objetos, pode usar a herança para facilitar o trabalho com classes relacionadas. Por exemplo, podes criar Instructor classes e Student que derivam de uma Person classe base. Pode criar os mesmos tipos de estruturas de herança entre entidades no Entity Framework.

Nesta parte do tutorial, não vais criar novas páginas web. Em vez disso, irá adicionar entidades derivadas ao modelo de dados e modificar páginas existentes para usar as novas entidades.

Tabela por Hierarquia versus Tabela por Tipo de Herança

Uma base de dados pode armazenar informação sobre objetos relacionados numa única tabela ou em múltiplas tabelas. Por exemplo, na base de School dados, a Person tabela inclui informações sobre estudantes e professores numa única tabela. Algumas das colunas aplicam-se apenas a instrutores (HireDate), outras apenas a alunos (EnrollmentDate), e outras a ambos (LastName, FirstName).

image11

Pode configurar o Entity Framework para criar entidades Instructor e Student que herdam da entidade Person. Este padrão de gerar uma estrutura de herança de entidades a partir de uma única tabela de base de dados é chamado herança tabela por hierarquia (TPH).

Para os cursos, a School base de dados utiliza um padrão diferente. Os cursos online e os cursos presenciais são armazenados em tabelas separadas, cada uma com uma chave estrangeira que aponta para a Course tabela. A informação comum a ambos os tipos de cursos é armazenada apenas na Course tabela.

imagem12

Pode configurar o modelo de dados do Entity Framework de forma que as entidades OnlineCourse e OnsiteCourse herdem da entidade Course. Este padrão de gerar uma estrutura de herança de entidades a partir de tabelas separadas para cada tipo, com cada tabela separada a referir-se para uma tabela que armazena dados comuns a todos os tipos, chama-se herança de tabela por tipo (TPT).

Os padrões de herança TPH geralmente oferecem melhor desempenho no Entity Framework do que os padrões de herança TPT, porque os padrões TPT podem resultar em consultas de junção complexas. Esta orientação passo a passo demonstra como implementar a herança TPH. Fará isso realizando os seguintes passos:

  • Criar Instructor e Student tipos de entidade que derivam de Person.
  • Transferir as propriedades relacionadas à entidade Person para as entidades derivadas.
  • Defina restrições sobre propriedades nos tipos derivados.
  • Torna a Person entidade uma entidade abstrata.
  • Mapeie cada entidade derivada para a Person tabela com uma condição que especifique como determinar se uma Person linha representa esse tipo derivado.

Adição de Entidades de Instrutor e Estudante

Abra o ficheiro SchoolModel.edmx , clique com o botão direito numa área desocupada no designer, selecione Adicionar e depois selecione Entidade.

image01

Na caixa de diálogo Adicionar Entidade , nomeie a entidade Instructor e defina a opção do tipo Base para Person.

image02

Clique em OK. O designer cria uma Instructor entidade que deriva dessa Person entidade. A nova entidade ainda não possui quaisquer propriedades.

image03

Repete o procedimento para criar uma Student entidade que também deriva de Person.

Apenas os instrutores têm datas de contratação, por isso tem de transferir essa propriedade da entidade Person para a entidade Instructor. Na Person entidade, clique com o botão direito na HireDate propriedade e clique em Cortar. Depois, clique com o botão direito do rato sobre Propriedades na entidade Instructor e depois seleciona Colar.

image04

A data de contratação de uma Instructor entidade não pode ser nula. Clique com o botão direito na HireDate propriedade, clique em Propriedades e, depois, na janela de Propriedades , altere Nullable para False.

image05

Repita o procedimento para transferir a EnrollmentDate propriedade da Person entidade para a entidade Student . Certifique-se de que também define Nullable como False para a propriedade EnrollmentDate.

Agora que uma Person entidade possui apenas as propriedades comuns às entidades Instructor e Student (além das propriedades de navegação, que não estão a ser movidas), a entidade só pode ser utilizada como entidade base na estrutura de herança. Por isso, deve garantir que nunca é tratado como uma entidade independente. Clique com o botão direito na Person entidade, selecione Propriedades e, na janela de Propriedades , altere o valor da propriedade Abstraída para Verdadeiro.

image06

Mapear Entidades de Instrutores e Alunos para a Tabela de Pessoa

Agora deve indicar ao Entity Framework como diferenciar entre as entidades Instructor e Student na base de dados.

Clique com o botão direito na Instructor entidade e selecione Mapeamento de Tabelas. Na janela de Detalhes do Mapeamento , clique em Adicionar uma Tabela ou Vista e selecione Pessoa.

image07

Clique em Adicionar uma Condição e depois selecione Data de Contratação.

image09

Altere o operador para é e valor / propriedade para não nulo.

imagem10

Repita o procedimento para a Students entidade, especificando que esta entidade corresponde à Person tabela quando a EnrollmentDate coluna não é nula. Depois guarda e fecha o modelo de dados.

Constrói o projeto para criar as novas entidades como classes e torná-las disponíveis no designer.

Utilização do Instrutor e das Entidades Estudantis

Quando criou as páginas web que trabalham com dados de estudantes e docentes, vinculou-os ao conjunto de entidades Person, e filtrou pela propriedade HireDate ou EnrollmentDate para restringir os dados devolvidos a estudantes ou docentes. No entanto, agora, ao associar cada controlo de fonte de dados ao Person conjunto de entidades, pode especificar que apenas Student ou Instructor tipos de entidade devem ser selecionados. Como o Entity Framework sabe como diferenciar estudantes e instrutores no Person conjunto de entidades, pode remover as Where definições de propriedades que introduziu manualmente para isso.

No Visual Studio Designer, pode especificar o tipo de entidade que um EntityDataSource controlo deve selecionar na caixa suspensa EntityTypeFilter do Configure Data Source assistente, como mostrado no exemplo seguinte.

image13

E na janela de Propriedades pode remover Where valores de cláusulas que já não são necessários, como mostrado no exemplo seguinte.

image14

No entanto, como alteraste a marcação dos EntityDataSource controlos para usarem o ContextTypeName atributo, não podes executar o assistente Configurar Fonte de Dados em EntityDataSource controlos que já criaste. Assim, você fará as alterações necessárias alterando a marcação.

Abre a página Students.aspx . No StudentsEntityDataSource controlo, remove o Where atributo e adiciona um EntityTypeFilter="Student" atributo. A marcação vai agora assemelhar-se ao seguinte exemplo:

<asp:EntityDataSource ID="StudentsEntityDataSource" runat="server" 
        ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False"
        EntitySetName="People" EntityTypeFilter="Student"
        Include="StudentGrades"
        EnableDelete="True" EnableUpdate="True" 
        OrderBy="it.LastName" >
    </asp:EntityDataSource>

Definir o EntityTypeFilter atributo garante que o controlo EntityDataSource selecionará apenas o tipo de entidade especificado. Se quisesses recuperar os tipos de entidade Student e Instructor, não definarias este atributo. (Tem a opção de recuperar vários tipos de entidades com um EntityDataSource controlo apenas se estiver a usar o controlo para acesso a dados apenas de leitura. Se estiveres a usar um EntityDataSource controlo para inserir, atualizar ou eliminar entidades, e se o conjunto de entidades a que está ligado pode conter vários tipos, só podes trabalhar com um tipo de entidade, e tens de definir esse atributo.)

Repita o procedimento para o controlo SearchEntityDataSource, exceto removendo apenas a parte do atributo Where que seleciona entidades Student em vez de remover a propriedade completamente. A etiqueta de abertura do controlo vai agora assemelhar-se ao seguinte exemplo:

<asp:EntityDataSource ID="SearchEntityDataSource" runat="server" 
        ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False" 
        EntitySetName="People" EntityTypeFilter="Student"
        Where="it.FirstMidName Like '%' + @StudentName + '%' or it.LastName Like '%' + @StudentName + '%'" >

Executa a página para confirmar se ainda funciona como antes.

image15

Atualiza as páginas seguintes que criaste nos tutoriais anteriores para que usem os novos Student and Instructor entities em vez de Person entities, depois executa-as para verificar se funcionam como antes:

  • Em StudentsAdd.aspx, adicione EntityTypeFilter="Student" ao StudentsEntityDataSource controlo. A marcação vai agora assemelhar-se ao seguinte exemplo:

    <asp:EntityDataSource ID="StudentsEntityDataSource" runat="server" 
            ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False"
            EntitySetName="People" EntityTypeFilter="Student"
            EnableInsert="True" 
        </asp:EntityDataSource>
    

    imagem16

  • Em About.aspx, adicione EntityTypeFilter="Student" ao StudentStatisticsEntityDataSource controlo e remova Where="it.EnrollmentDate is not null". A marcação vai agora assemelhar-se ao seguinte exemplo:

    <asp:EntityDataSource ID="StudentStatisticsEntityDataSource" runat="server" 
            ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False" 
            EntitySetName="People" EntityTypeFilter="Student"
            Select="it.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudents"
            OrderBy="it.EnrollmentDate" GroupBy="it.EnrollmentDate" >
        </asp:EntityDataSource>
    

    image17

  • Em Instructors.aspx e InstructorsCourses.aspx, adicione EntityTypeFilter="Instructor" ao InstructorsEntityDataSource controlo e remova Where="it.HireDate is not null". A marcação em Instructors.aspx assemelha-se agora ao seguinte exemplo:

    <asp:EntityDataSource ID="InstructorsEntityDataSource" runat="server" 
                ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="false"
                EntitySetName="People" EntityTypeFilter="Instructor" 
                Include="OfficeAssignment" 
                EnableUpdate="True">
            </asp:EntityDataSource>
    

    imagem18

    A marcação em InstructorsCourses.aspx vai agora assemelhar-se ao seguinte exemplo:

    <asp:EntityDataSource ID="InstructorsEntityDataSource" runat="server" 
            ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False" 
            EntitySetName="People" EntityTypeFilter="Instructor" 
            Select="it.LastName + ',' + it.FirstMidName AS Name, it.PersonID">
        </asp:EntityDataSource>
    

    image19

Como resultado destas mudanças, melhorou a capacidade de manutenção da aplicação da Contoso University de várias formas. Moveu a lógica de seleção e validação da camada de interface do utilizador (.aspx marcação) e tornou-a uma parte integrante da camada de acesso aos dados. Isto ajuda a isolar o código da sua aplicação das alterações que possa fazer no futuro ao esquema da base de dados ou ao modelo de dados. Por exemplo, pode decidir que os alunos podem ser contratados como auxiliares de ensino e, por isso, terão uma data de contratação. Poderias então adicionar uma nova propriedade para diferenciar os alunos dos professores e atualizar o modelo de dados. Nenhum código na aplicação web teria de mudar, exceto onde queres mostrar uma data de contratação para os estudantes. Outra vantagem de adicionar Instructor e Student entidades é que o seu código é mais facilmente compreensível do que quando se referia a Person objetos que eram realmente estudantes ou instrutores.

Agora já viu uma forma de implementar um padrão de herança no Entity Framework. No tutorial seguinte, vai aprender a usar procedimentos armazenados para ter mais controlo sobre como o Entity Framework acede à base de dados.