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.

Este tópico mostra como executar as tarefas a seguir.

  • 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

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

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

 

Criar um modelo com base no banco de dados escolar

  • Clique com o botão direito do mouse no nome do projeto no Gerenciador de Soluções, 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 as Conexões de Dados é atualizada com suas configurações de conexão de banco de dados.

  • Na caixa de diálogo Escolher Objetos do 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:

    Aviso 2

 

Adicionar uma consulta de definição

Nesta 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).
    • Neste 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 você executar posteriormente 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 sobrescritas.

 

Adicionar um tipo de entidade ao modelo

Nesta 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.
  • Neste 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:

    Aviso 2

 

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

  • Clique com o botão direito do mouse na superfície do designer e selecione Adicionar Nova>Entidade....
  • Especifique GradeReport para o nome da entidade e CourseID para a propriedade-chave.
  • 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 Tipo da Nota 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

Nesta 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 no menu suspenso <Adicionar uma Tabela ou Visualização> (localizado em Tabelas).
    Os mapeamentos padrão entre o tipo de entidade GradeReport conceitual e de armazenamento são exibidos.
    Detalhes do mapeamento3

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