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 funções ou procedimentos armazenados 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:
- Uma versão recente do Visual Studio.
- O banco de dados do exemplo escolar.
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.A partir do Visual Studio 2012, o Designer do EF dá suporte à importação em massa de procedimentos armazenados. A opçãoImportar funções e procedimentos armazenados selecionados para o modelo de entidade está selecionada 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 Recuperar dados usando um DataReader para obter mais detalhes.