Procedimentos Armazenados de Consulta ao Designer

Esta explicação passo a passo mostra como usar o Entity Framework Designer (EF Designer) para importar procedimentos armazenados para um modelo e depois chamar os procedimentos armazenados importados para obter resultados.

Note que o Code First não suporta mapeamento para procedimentos ou funções armazenadas. No entanto, pode chamar procedimentos ou funções armazenadas usando o método System.Data.Entity.DbSet.SqlQuery. Por exemplo:

var query = context.Products.SqlQuery("EXECUTE [dbo].[GetAllProducts]")`;

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 .
  • Insira EFwithSProcsSample como nome.
  • Selecione OK.

Criar um modelo

  • Clique com o botão direito no 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 EFwithSProcsModel.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 de Base de Dados, assinale a caixa de seleção Tabelas para selecionar todas as tabelas.
    Além disso, selecione os seguintes procedimentos armazenados no nó Stored Procedures and Functions : GetStudentGrades e GetDepartmentName.

    Importar Procedimentos Armazenados

    A partir do Visual Studio 2012, o EF Designer suporta a importação em massa de procedimentos armazenados. A opção Importar procedimentos armazenados e funções selecionados no modelo de entidade está marcada por defeito.

  • Clique em Concluir.

Por defeito, a forma de resultado de cada procedimento ou função armazenada importada que devolve mais do que uma coluna tornar-se-á automaticamente um novo tipo complexo. Neste exemplo, queremos mapear os resultados da função GetStudentGrades para a entidade StudentGrade e os resultados do GetDepartmentName para nenhum (nenhum é o valor padrão).

Para que uma importação de função devolva um tipo de entidade, as colunas devolvidas pelo procedimento armazenado correspondente devem corresponder exatamente às propriedades escalares do tipo de entidade devolvido. Uma importação de função pode também devolver coleções de tipos simples, tipos complexos ou sem valor.

  • Clique com o botão direito na superfície de design e selecione Navegador de Modelos.
  • No Navegador de Modelos, selecione Importações de Função e depois clique duas vezes na função GetStudentGrades.
  • Na caixa de diálogo Editar Importação de Função, selecione Entidades e escolha StudentGrade.
    A caixa de seleção Importação de Função é componível, localizada no topo da caixa de diálogo Importação de Funções, permitirá que mapeie para funções componíveis. Se assinalares esta caixa, apenas funções componíveis (Funções com valores em tabela) aparecerão na lista suspensa de Procedimentos Armazenados / Nome da Função . Se não assinalares esta caixa, apenas funções não componíveis serão apresentadas na lista.

Usar o Modelo

Abra o ficheiro Program.cs onde o método principal está definido. Adicione o seguinte código à função principal.

O código chama dois procedimentos armazenados: GetStudentGrades (devolve StudentGrades para o StudentId) especificado e GetDepartmentName (devolve o nome do departamento no parâmetro de saída).  

    using (SchoolEntities context = new SchoolEntities())
    {
        // Specify the Student ID.
        int studentId = 2;

        // Call GetStudentGrades and iterate through the returned collection.
        foreach (StudentGrade grade in context.GetStudentGrades(studentId))
        {
            Console.WriteLine("StudentID: {0}\tSubject={1}", studentId, grade.Subject);
            Console.WriteLine("Student grade: " + grade.Grade);
        }

        // Call GetDepartmentName.
        // Declare the name variable that will contain the value returned by the output parameter.
        ObjectParameter name = new ObjectParameter("Name", typeof(String));
        context.GetDepartmentName(1, name);
        Console.WriteLine("The department name is {0}", name.Value);

    }

Compilar e executar a aplicação. O programa produz a seguinte saída:

StudentID: 2
Student grade: 4.00
StudentID: 2
Student grade: 3.50
The department name is Engineering

Parâmetros de saída

Se forem usados parâmetros de saída, os seus valores não estarão disponíveis até que os resultados tenham sido lidos na totalidade. Isto deve-se ao comportamento subjacente do DbDataReader, veja Recuperar Dados Usando um DataReader para mais detalhes.