Share via


Procedimentos armazenados de consulta de designer

Esse passo a passo mostra como usar o Designer do Entity Framework (Designer do EF) para importar procedimentos armazenados para um modelo e, em seguida, chamar os procedimentos armazenados importados para recuperar resultados.

Observe que o Code First não dá suporte ao mapeamento para procedimentos ou funções armazenados. No entanto, você pode chamar procedimentos armazenados ou funções usando o método System.Data.Entity.DbSet.SqlQuery. Por exemplo:

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

Pré-requisitos

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

Configurar o Projeto

  • Open Visual Studio 2012.
  • Selecione Arquivo-> Novo -> Projeto
  • No painel esquerdo, clique em Visual C#e selecione o modelo de Console.
  • Insira EFwithSProcsSample como o nome.
  • Selecione OK.

Criar um modelo

  • Clique com o botão direito do mouse no projeto em Gerenciador de Soluções e selecione Adicionar> - Novo Item.

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

  • Insira EFwithSProcsModel.edmx como 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 Seus Objetos de Banco de Dados, marque a caixa de seleção Tabelas para selecionar todas as tabelas.
    Além disso, selecione os seguintes procedimentos armazenados no nó Procedimentos e Funções Armazenados: GetStudentGrades e GetDepartmentName.

    Import Stored Procedures

    A partir do Visual Studio 2012, o Designer do EF dá suporte à importação em massa de procedimentos armazenados. A opçãoImportar procedimentos e funções armazenados selecionados para o modelo de entidade está marcada por padrão.

  • Clique em Concluir.

Por padrão, a forma de resultado de cada procedimento ou função armazenada importada que retorna mais de uma coluna se tornará um novo tipo complexo automaticamente. 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 retorne um tipo de entidade, as colunas retornadas pelo procedimento armazenado correspondente devem corresponder exatamente às propriedades escalares do tipo de entidade retornado. Uma importação de função também pode retornar coleções de tipos simples, tipos complexos ou nenhum valor.

  • Clique com o botão direito do mouse na superfície de design e selecione Navegador de Modelos.
  • No Navegador de Modelos, selecione Importações de Função e clique duas vezes na função GetStudentGrades.
  • Na caixa de diálogo Editar Importação de Função, selecione Entidades e escolha StudentGrade.
    A Importação de Funções é uma caixa de seleção combinável na parte superior da caixa de diálogo Importações de Funções, permitindo que você mapeie para funções combináveis. Se você marcar essa caixa, somente funções combináveis (Funções com valor de tabela) aparecerão na lista suspensa Procedimento Armazenado/Nome da Função. Se você não marcar essa caixa, somente funções não combináveis serão mostradas na lista.

Usar o modelo

Abra o arquivo Program.cs em que o método Principal está definido. Adicione o código a seguir à função Principal.

O código chama dois procedimentos armazenados: GetStudentGrades (retorna StudentGrades para o StudentIdespecificado) e GetDepartmentName (retorna 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);

    }

Compile e execute o aplicativo. 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 os parâmetros de saída forem usados, seus valores não estarão disponíveis até que os resultados tenham sido lidos completamente. Isso ocorre devido ao comportamento subjacente de DbDataReader, consulte Como recuperar dados usando um DataReader para obter mais detalhes.