Share via


Definindo a consulta – Designer EF

Este passo a passo demonstra como adicionar uma consulta definidora e um tipo de entidade correspondente a um modelo usando o Designer EF. Uma consulta de definição geralmente é usada para fornecer funcionalidade semelhante à fornecida por um modo de exibição de banco de dados, mas a exibição é definida no modelo, não no banco de dados. Uma consulta de definição permite executar uma instrução SQL especificada no elemento DefiningQuery de um arquivo .edmx. Para obter mais informações, consulte DefiningQuery na Especificação SSDL.

Ao usar a definição de consultas, você também precisa definir um tipo de entidade em seu modelo. O tipo de entidade é usado para exibir dados expostos pela consulta de definição. Observe que os dados exibidos por meio desse tipo de entidade são somente leitura.

Consultas parametrizadas não podem ser executadas como consultas de definição. No entanto, os dados podem ser atualizados mapeando as funções de inserção, atualização e exclusão do tipo de entidade que apresenta os dados aos procedimentos armazenados. Para obter mais informações, consulte Inserir, Atualizar e Excluir com Procedimentos Armazenados.

Esse tópico mostra como executar as seguintes tarefas.

  • Adicionar uma consulta de definição
  • Adicionar um tipo de entidade ao modelo
  • Mapear a consulta de definição para o tipo de entidade

Pré-requisitos

Para concluir esta explicação passo a passo, será necessário:

Configurar o Projeto

Esse passo a passo está usando o Visual Studio 2012 ou mais recente.

  • Abra o Visual Studio.
  • No menu Arquivo , aponte para Novoe clique em Projeto.
  • No painel esquerdo, clique em Visual C# e selecione o modelo do Aplicativo de Console.
  • Insira DefiningQuerySample como o nome do projeto e clique em OK.

 

Criar um modelo com base no banco de dados escolar

  • No Gerenciador de Soluções, clique com o botão direito do mouse no projeto, aponte para Adicionar e clique em Novo Item.

  • Selecione Dados no menu à esquerda e selecione Modelo de Dados de Entidade ADO.NET no painel Modelos.

  • Insira DefiningQueryModel.edmx para o nome do arquivo e clique em Adicionar.

  • Na caixa de diálogo Escolher Conteúdos do Modelo, selecione Gerar do banco de dados e, em seguida, clique em Próximo.

  • Clique em Nova Conexão. Na caixa de diálogo Propriedades da Conexão, insira o nome do servidor (por exemplo, (localdb)\mssqllocaldb), selecione o método de autenticação, digite Escolar como o nome do banco de dados e clique em OK. A caixa de diálogo Escolher suas Conexões de Dados é atualizada com suas configurações de conexões de banco de dados.

  • Na caixa de diálogo Escolher Seus Objetos de Banco de Dados, marque o nó Tabelas. Isso adicionará todas as tabelas ao modelo de Escola.

  • Clique em Concluir.

  • No Gerenciador de Soluções, clique com o botão direito do mouse no arquivo DefiningQueryModel.edmx e selecione Abrir com....

  • Selecione o Editor XML (Texto).

    XML Editor

  • Clique em Sim se solicitado com a seguinte mensagem:

    Warning 2

 

Adicionar uma consulta de definição

Nessa etapa, usaremos o Editor XML para adicionar uma consulta definidora e um tipo de entidade à seção SSDL do arquivo .edmx. 

  • Adicione um elemento EntitySet à seção SSDL do arquivo .edmx (linha 5 a 13). Especifique o seguinte:
    • Somente os atributos Name e EntityType do elemento EntitySet são especificados.
    • O nome totalmente qualificado do tipo de entidade é usado no atributo EntityType.
    • A instrução SQL a ser executada é especificada no elemento DefiningQuery.
    <!-- SSDL content -->
    <edmx:StorageModels>
      <Schema Namespace="SchoolModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl">
        <EntityContainer Name="SchoolModelStoreContainer">
           <EntitySet Name="GradeReport" EntityType="SchoolModel.Store.GradeReport">
              <DefiningQuery>
                SELECT CourseID, Grade, FirstName, LastName
                FROM StudentGrade
                JOIN
                (SELECT * FROM Person WHERE EnrollmentDate IS NOT NULL) AS p
                ON StudentID = p.PersonID
              </DefiningQuery>
          </EntitySet>
          <EntitySet Name="Course" EntityType="SchoolModel.Store.Course" store:Type="Tables" Schema="dbo" />
  • Adicione o elemento EntityType à seção SSDL do .edmx. arquivo, conforme mostrado abaixo. Observe o seguinte:
    • O valor do atributo Name corresponde ao valor do atributo EntityType no elemento EntitySet acima, embora o nome totalmente qualificado do tipo de entidade seja usado no atributo EntityType.
    • Os nomes de propriedade correspondem aos nomes de coluna retornados pela instrução SQL no elemento DefiningQuery (acima).
    • Nesse exemplo, a chave de entidade é composta por três propriedades para garantir um valor de chave exclusivo.
    <EntityType Name="GradeReport">
      <Key>
        <PropertyRef Name="CourseID" />
        <PropertyRef Name="FirstName" />
        <PropertyRef Name="LastName" />
      </Key>
      <Property Name="CourseID"
                Type="int"
                Nullable="false" />
      <Property Name="Grade"
                Type="decimal"
                Precision="3"
                Scale="2" />
      <Property Name="FirstName"
                Type="nvarchar"
                Nullable="false"
                MaxLength="50" />
      <Property Name="LastName"
                Type="nvarchar"
                Nullable="false"
                MaxLength="50" />
    </EntityType>

Observação

Se posteriormente você executar a caixa de diálogo Assistente de Modelo de Atualização, todas as alterações feitas no modelo de armazenamento, incluindo a definição de consultas, serão substituídas.

 

Adicionar um tipo de entidade ao modelo

Nessa etapa, adicionaremos o tipo de entidade ao modelo conceitual usando o Designer EF.  Observe o seguinte:

  • O nome da entidade corresponde ao valor do atributo EntityType no elemento EntitySet acima.
  • Os nomes de propriedade correspondem aos nomes de coluna retornados pela instrução SQL no elemento DefiningQuery acima.
  • Nesse exemplo, a chave de entidade é composta por três propriedades para garantir um valor de chave exclusivo.

Abra o modelo no Designer EF.

  • Clique duas vezes em DefiningQueryModel.edmx.

  • Diga Sim para a seguinte mensagem:

    Warning 2

 

O Designer do Entity, que fornece uma superfície de design para editar seu modelo, é exibido.

  • Clique com o botão direito do mouse na superfície de designer e selecione Adicionar Novo–>Entidade....
  • Especifique GradeReport para o nome da entidade e CourseID para a propriedade Key.
  • Clique com o botão direito do mouse na entidade GradeReport e selecione Adicionar Novo->Propriedade escalar.
  • Altere o nome padrão da propriedade para FirstName.
  • Adicione outra propriedade escalar e especifique LastName para o nome.
  • Adicione outra propriedade escalar e especifique Grade para o nome.
  • Na janela Propriedades, altere a propriedade Grade’s Type para Decimal.
  • Selecione as propriedades FirstName e LastName.
  • Na janela Propriedades, altere o valor da propriedade EntityKey para True.

Como resultado, os seguintes elementos foram adicionados à seção CSDL do arquivo .edmx.

    <EntitySet Name="GradeReport" EntityType="SchoolModel.GradeReport" />

    <EntityType Name="GradeReport">
    . . .
    </EntityType>

 

Mapear a consulta de definição para o tipo de entidade

Nessa etapa, usaremos a janela Detalhes de Mapeamento para mapear os tipos de entidade conceitual e de armazenamento.

  • Clique com o botão direito do mouse na entidade GradeReport na superfície de design e selecione Mapeamento de Tabela.
    A janela Detalhes do Mapeamento é exibida.
  • Selecione GradeReport na lista suspensa <Adicionar uma Tabela ou Exibição> (localizada em Tabelas).
    Os mapeamentos padrão entre o tipo de entidade GradeReport conceitual e de armazenamento são exibidos.
    Mapping Details3

Como resultado, o elemento EntitySetMapping é adicionado à seção de mapeamento do arquivo .edmx. 

    <EntitySetMapping Name="GradeReports">
      <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.GradeReport)">
        <MappingFragment StoreEntitySet="GradeReport">
          <ScalarProperty Name="LastName" ColumnName="LastName" />
          <ScalarProperty Name="FirstName" ColumnName="FirstName" />
          <ScalarProperty Name="Grade" ColumnName="Grade" />
          <ScalarProperty Name="CourseID" ColumnName="CourseID" />
        </MappingFragment>
      </EntityTypeMapping>
    </EntitySetMapping>
  • Compile o aplicativo.

 

Chamar a consulta de definição em seu código

Agora você pode executar a consulta de definição usando o tipo de entidade GradeReport

    using (var context = new SchoolEntities())
    {
        var report = context.GradeReports.FirstOrDefault();
        Console.WriteLine("{0} {1} got {2}",
            report.FirstName, report.LastName, report.Grade);
    }