Partilhar via


Herança TPH de Designer

Este passo a passo mostra como implementar a herança tabela por hierarquia (TPH) no seu modelo conceptual com o Entity Framework Designer (EF Designer). A herança TPH utiliza uma tabela de base de dados para manter os dados de todos os tipos de entidade na hierarquia de herança.

Neste tutorial, iremos mapear a tabela Person para três tipos de entidades: Person (o tipo base), Student (que deriva de Person) e Instructor (que deriva de Person). Vamos criar um modelo conceptual a partir da base de dados (Base de Dados Primeiro) e depois alterar o modelo para implementar a herança TPH usando o EF Designer.

É possível mapear uma herança TPH utilizando o Model First, mas precisaria criar o seu próprio fluxo de trabalho para a geração da base de dados, o que é complexo. Depois, atribuiria este fluxo de trabalho à propriedade Workflow de Geração de Base de Dados no EF Designer. Uma alternativa mais fácil é usar o Code First.

Outras Opções de Herança

Tabela por Tipo (TPT) é outro tipo de herança em que tabelas separadas na base de dados são mapeadas para entidades que participam na herança.  Para informações sobre como mapear a herança Table-per-Type com o EF Designer, consulte EF Designer TPT Inheritance.

Os modelos de herança Tabela por Tipo (TPC) e de herança mista são suportados pelo tempo de execução do Entity Framework, mas não são suportados pelo EF Designer. Se quiseres usar TPC ou herança mista, tens duas opções: usar o Code First ou editar manualmente o ficheiro EDMX. Se optar por trabalhar com o ficheiro EDMX, a Janela de Detalhes de Mapeamento será colocada em "modo de segurança" e não poderá usar o designer para alterar os mapeamentos.

Pré-requisitos

Para completar esta explicação, vai precisar de:

Criar o Projeto

  • Abra o Visual Studio 2012.
  • Seleccione Ficheiro -> Novo -> Projeto
  • No painel esquerdo, clique em Visual C# e depois selecione o modelo Console .
  • Introduza TPHDBFirstSample como nome.
  • Selecione OK.

Criar um modelo

  • Clique com o botão direito no nome do projeto no Explorador de Soluções e selecione Adicionar -> Novo Item.
  • Selecione Dados no menu esquerdo e depois selecione ADO.NET Modelo de Dados de Entidade no painel de Modelos.
  • Introduza TPHModel.edmx para o nome do ficheiro e depois clique em Adicionar.
  • Na caixa de diálogo Escolher Conteúdo do Modelo, selecione Gerar a partir da base de dados e depois clique em Próximo.
  • Clique em Nova Ligação. Na caixa de diálogo Propriedades da Ligação, introduza o nome do servidor (por exemplo, (localdb)\mssqllocaldb), selecione o método de autenticação, escreva School para o nome da base de dados e depois clique em OK. A caixa de diálogo Escolha a Sua Ligação de Dados é atualizada com as definições de ligação à base de dados.
  • Na caixa de diálogo Escolher os Seus Objetos da Base de Dados, no nó de Tabelas, selecione a tabela Person.
  • Clique em Concluir.

O Designer de Entidades, que fornece uma superfície de design para editar o seu modelo, é exibido. Todos os objetos que selecionaste na caixa de diálogo Escolhe os Teus Objetos de Base de Dados são adicionados ao modelo.

É assim que a tabela Person se apresenta na base de dados.

Tabela de Pessoas  

Implementar a Herança de Tabela por Hierarquia

A tabela Pessoa tem a coluna Discriminador , que pode ter um de dois valores: "Aluno" e "Instrutor". Dependendo do valor, a tabela Pessoa será mapeada para a entidade Estudante ou para a entidade Instrutor . A Tabela Person também tem duas colunas, HireDate e EnrollmentDate, que devem ser nulos porque uma pessoa não pode ser aluno(a) e instrutor(a) ao mesmo tempo (pelo menos não nesta demonstração).

Adicionar novas Entidades

  • Adicione uma nova entidade. Para isso, clique com o botão direito num espaço vazio da superfície de design do Entity Framework Designer e selecione Adicionar> Entidade.
  • Escreva Instrutor para o Nome da entidade e selecione Pessoa na lista suspensa para o tipo base.
  • Clique em OK.
  • Adiciona outra nova entidade. Digite Estudante para o nome da Entidade e selecione Pessoa na lista suspensa para o tipo Base.

Dois novos tipos de entidades foram adicionados à superfície de design. Uma seta aponta dos novos tipos de entidade para o tipo de entidade Pessoa ; isto indica que Pessoa é o tipo base para os novos tipos de entidade.

  • Clique com o botão direito do rato na propriedade HireDate da entidade Pessoa. Selecione Cortar (ou prima Ctrl-X).
  • Clique com o botão direito na entidade Instrutor e selecione Colar (ou use a tecla Ctrl-V).
  • Clique com o botão direito na propriedade HireDate e selecione Propriedades.
  • Na janela de Propriedades , defina a propriedade Nullable como false.
  • Clique com o botão direito na propriedade Data de Matrícula da entidade Pessoa. Selecione a opção Cortar (ou use a tecla Ctrl-X).
  • Clique com o botão direito na entidade Estudante e selecione Colar (ou use a tecla Ctrl-V).
  • Selecione a propriedade EnrollmentDate e defina a propriedade Nullable para false.
  • Selecione o tipo de entidade Pessoa. Na janela de Propriedades , defina a sua propriedade Abstraída como verdadeira.
  • Eliminar a propriedade Discriminador de Pessoa. A razão pela qual deve ser eliminada é explicada na secção seguinte.

Mapear as entidades

  • Clique com o botão direito no Instrutor e selecione Mapeamento de Tabelas. A entidade Instrutor é selecionada na janela de Detalhes de Mapeamento.

  • Clique <em Adicionar uma Tabela ou Vista> na janela de Detalhes do Mapeamento . O< campo Adicionar uma Tabela ou Vista> torna-se uma lista suspensa de tabelas ou vistas para as quais a entidade selecionada pode ser mapeada.

  • Selecione Pessoa na lista suspensa.

  • A janela Detalhes do Mapeamento é atualizada com mapeamentos de colunas predefinidos e com uma opção para adicionar uma condição.

  • Clique em <Adicionar uma Condição>. O <campo Adicionar uma Condição> torna-se uma lista suspensa de colunas para as quais podem ser definidas condições.

  • Selecione Discriminador na lista suspensa.

  • Na coluna Operador da janela Detalhes do Mapeamento, selecione = na lista suspensa.

  • Na coluna Valor/Propriedade , escreve Instrutor. O resultado final deve ser assim:

    Detalhes do Mapeamento

  • Repita estes passos para o tipo de entidade Estudante , mas faça a condição igual ao valor Estudante .
    A razão pela qual quisemos remover a propriedade Discriminador é porque não se pode mapear uma coluna de tabela mais do que uma vez. Esta coluna será usada para mapeamento condicional, pelo que não pode ser usada também para mapeamento de propriedades. A única forma de ser usado para ambos é se uma condição usar uma comparação Is Null ou Is Not Null.

A herança de tabela por hierarquia foi agora implementada.

Final TPH

Usar o Modelo

Abra o ficheiro Program.cs onde o método principal está definido. Cole o código seguinte na função principal . O código executa três consultas. A primeira consulta traz de volta todos os objetos Person . A segunda consulta utiliza o método OfType para devolver objetos Instructor . A terceira consulta utiliza o método OfType para devolver objetos Student .

    using (var context = new SchoolEntities())
    {
        Console.WriteLine("All people:");
        foreach (var person in context.People)
        {
            Console.WriteLine("    {0} {1}", person.FirstName, person.LastName);
        }

        Console.WriteLine("Instructors only: ");
        foreach (var person in context.People.OfType<Instructor>())
        {
            Console.WriteLine("    {0} {1}", person.FirstName, person.LastName);
        }

        Console.WriteLine("Students only: ");
        foreach (var person in context.People.OfType<Student>())
        {
            Console.WriteLine("    {0} {1}", person.FirstName, person.LastName);
        }
    }