Entity Framework - procedimentos armazenados
O Entity Framework permite que você use procedimentos armazenados no Entity Data Model em vez de, ou em combinação com, sua geração automática de comando.
Você pode usar procedimentos armazenados para executar lógica predefinida em tabelas de banco de dados, e muitas organizações têm políticas em vigor que exigem o uso desses procedimentos armazenados.
Ele também pode especificar que EF deve usar seus procedimentos armazenados para inserir, atualizar ou excluir entidades.
Embora os comandos construídos dinamicamente sejam seguros, eficientes e geralmente tão bons ou melhores do que aqueles que você mesmo escreve, há muitos casos em que já existem procedimentos armazenados e as práticas da sua empresa podem restringir o uso direto das tabelas.
Como alternativa, você pode apenas desejar ter controle explícito sobre o que é executado na loja e preferir criar procedimentos armazenados.
O exemplo a seguir cria um novo projeto em Arquivo → Novo → Projeto.
Step 1 - Selecione o aplicativo de console no painel do meio e insira StoredProceduresDemo no campo de nome.
Step 2 - No explorador de servidores, clique com o botão direito em seu banco de dados.
Step 3 - Selecione Nova consulta e insira o código a seguir no editor T-SQL para adicionar uma nova tabela em seu banco de dados.
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id =
OBJECT_ID(N'[dbo].[StudentGrade]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[StudentGrade](
[EnrollmentID] [int] IDENTITY(1,1) NOT NULL,
[CourseID] [int] NOT NULL,
[StudentID] [int] NOT NULL,
[Grade] [decimal](3, 2) NULL,
CONSTRAINT [PK_StudentGrade] PRIMARY KEY CLUSTERED (
[EnrollmentID] ASC
)
WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO
Step 4 - Clique com o botão direito no editor e selecione Executar.
Step 5- Clique com o botão direito em seu banco de dados e clique em atualizar. Você verá a tabela recém-adicionada em seu banco de dados.
Step 6 - No Server explorer, clique com o botão direito do mouse em seu banco de dados novamente.
Step 7 - Selecione Nova Consulta e digite o seguinte código no editor T-SQL para adicionar um procedimento armazenado em seu banco de dados, que retornará as notas dos Alunos.
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id =
OBJECT_ID(N'[dbo].[GetStudentGrades]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'
CREATE PROCEDURE [dbo].[GetStudentGrades]
@StudentID int
AS
SELECT EnrollmentID, Grade, CourseID, StudentID FROM dbo.StudentGrade
WHERE StudentID = @StudentID
'
END
GO
Step 8 - Clique com o botão direito no editor e selecione Executar.
Step 9- Clique com o botão direito em seu banco de dados e clique em atualizar. Você verá que um procedimento armazenado é criado em seu banco de dados.
Step 10 - Clique com o botão direito do mouse no nome do projeto no Solution Explorer e selecione Add → New Item.
Step 11 - Em seguida, selecione ADO.NET Entity Data Model no painel Templates.
Step 12 - Insira SPModel como nome e clique em Adicionar.
Step 13 - Na caixa de diálogo Choose Model Contents, selecione EF designer do banco de dados e clique em Next.
Step 14 - Selecione seu banco de dados e clique em Avançar.
Step 15 - Na caixa de diálogo Choose Your Database Objects, clique em tables, views.
Step 16 - Selecione a função GetStudentGradesForCourse localizada no nó Stored Procedures and Functions e clique em Concluir.
Step 17 - Selecione Exibir → Outras janelas → Navegador de modelo de dados de entidade e clique com o botão direito em GetStudentGrades em Importações de funções e selecione Editar.
Isso produzirá o seguinte diálogo.
Step 18 - Clique no botão de rádio Entities e selecione StudentGrade na combobox como tipo de retorno deste procedimento armazenado e clique em Ok.
Vamos dar uma olhada no código C # a seguir, no qual todas as notas serão recuperadas passando a ID do aluno como parâmetro no procedimento armazenado GetStudentGrades.
class Program {
static void Main(string[] args) {
using (var context = new UniContextEntities()) {
int studentID = 22;
var studentGrades = context.GetStudentGrades(studentID);
foreach (var student in studentGrades) {
Console.WriteLine("Course ID: {0}, Title: {1}, Grade: {2} ",
student.CourseID, student.Course.Title, student.Grade);
}
Console.ReadKey();
}
}
}
Quando o código acima for compilado e executado, você receberá a seguinte saída -
Course ID: 4022, Title: Microeconomics, Grade: 3.00
Course ID: 4041, Title: Macroeconomics, Grade: 3.50
Recomendamos que você execute o exemplo acima passo a passo para melhor compreensão.