Introdução com o Entity Framework 4.0 Database First e o ASP.NET 4 Web Forms – Parte 7
por Tom Dykstra
O aplicativo Web de exemplo da Contoso University demonstra como criar aplicativos ASP.NET Web Forms usando o Entity Framework 4.0 e o Visual Studio 2010. Para obter informações sobre a série de tutoriais, consulte o primeiro tutorial da série
Usando procedimentos armazenados
No tutorial anterior, você implementou um padrão de herança tabela por hierarquia. Este tutorial mostrará como usar procedimentos armazenados para obter mais controle sobre o acesso ao banco de dados.
O Entity Framework permite especificar que ele deve usar procedimentos armazenados para acesso ao banco de dados. Para qualquer tipo de entidade, você pode especificar um procedimento armazenado a ser usado para criar, atualizar ou excluir entidades desse tipo. Em seguida, no modelo de dados, você pode adicionar referências a procedimentos armazenados que você pode usar para executar tarefas como recuperar conjuntos de entidades.
O uso de procedimentos armazenados é um requisito comum para o acesso ao banco de dados. Em alguns casos, um administrador de banco de dados pode exigir que todo o acesso ao banco de dados passe por procedimentos armazenados por motivos de segurança. Em outros casos, talvez você queira criar lógica de negócios em alguns dos processos que o Entity Framework usa quando atualiza o banco de dados. Por exemplo, sempre que uma entidade é excluída, talvez você queira copiá-la para um banco de dados de arquivos. Ou sempre que uma linha for atualizada, talvez você queira gravar uma linha em uma tabela de registro em log que registra quem fez a alteração. Você pode executar esses tipos de tarefas em um procedimento armazenado que é chamado sempre que o Entity Framework exclui uma entidade ou atualiza uma entidade.
Como no tutorial anterior, você não criará novas páginas. Em vez disso, você alterará a maneira como o Entity Framework acessa o banco de dados para algumas das páginas que você já criou.
Neste tutorial, você criará procedimentos armazenados no banco de dados para inserção Student
e Instructor
entidades. Você os adicionará ao modelo de dados e especificará que o Entity Framework deve usá-los para adicionar Student
entidades e Instructor
ao banco de dados. Você também criará um procedimento armazenado que pode ser usado para recuperar Course
entidades.
Criando procedimentos armazenados no banco de dados
(Se você estiver usando o arquivo School.mdf do projeto disponível para download com este tutorial, ignore esta seção porque os procedimentos armazenados já existem.)
Em Servidor Explorer, expanda School.mdf, clique com o botão direito do mouse em Procedimentos Armazenados e selecione Adicionar Novo Procedimento Armazenado.
Copie as instruções SQL a seguir e cole-as na janela de procedimento armazenado, substituindo o procedimento armazenado esqueleto.
CREATE PROCEDURE [dbo].[InsertStudent]
@LastName nvarchar(50),
@FirstName nvarchar(50),
@EnrollmentDate datetime
AS
INSERT INTO dbo.Person (LastName,
FirstName,
EnrollmentDate)
VALUES (@LastName,
@FirstName,
@EnrollmentDate);
SELECT SCOPE_IDENTITY() as NewPersonID;
Student
as entidades têm quatro propriedades: PersonID
, LastName
, FirstName
e EnrollmentDate
. O banco de dados gera o valor da ID automaticamente e o procedimento armazenado aceita parâmetros para os outros três. O procedimento armazenado retorna o valor da chave de registro da nova linha para que o Entity Framework possa acompanhar isso na versão da entidade que mantém na memória.
Salve e feche a janela de procedimento armazenado.
Crie um InsertInstructor
procedimento armazenado da mesma maneira, usando as seguintes instruções SQL:
CREATE PROCEDURE [dbo].[InsertInstructor]
@LastName nvarchar(50),
@FirstName nvarchar(50),
@HireDate datetime
AS
INSERT INTO dbo.Person (LastName,
FirstName,
HireDate)
VALUES (@LastName,
@FirstName,
@HireDate);
SELECT SCOPE_IDENTITY() as NewPersonID;
Crie Update
também procedimentos armazenados para Student
entidades e Instructor
. (O banco de dados já tem um DeletePerson
procedimento armazenado que funcionará para as Instructor
entidades e Student
.)
CREATE PROCEDURE [dbo].[UpdateStudent]
@PersonID int,
@LastName nvarchar(50),
@FirstName nvarchar(50),
@EnrollmentDate datetime
AS
UPDATE Person SET LastName=@LastName,
FirstName=@FirstName,
EnrollmentDate=@EnrollmentDate
WHERE PersonID=@PersonID;
CREATE PROCEDURE [dbo].[UpdateInstructor]
@PersonID int,
@LastName nvarchar(50),
@FirstName nvarchar(50),
@HireDate datetime
AS
UPDATE Person SET LastName=@LastName,
FirstName=@FirstName,
HireDate=@HireDate
WHERE PersonID=@PersonID;
Neste tutorial, você mapeará todas as três funções – inserir, atualizar e excluir – para cada tipo de entidade. O Entity Framework versão 4 permite mapear apenas uma ou duas dessas funções para procedimentos armazenados sem mapear as outras, com uma exceção: se você mapear a função de atualização, mas não a função delete, o Entity Framework lançará uma exceção quando você tentar excluir uma entidade. No Entity Framework versão 3.5, você não tinha tanta flexibilidade no mapeamento de procedimentos armazenados: se você mapeou uma função, era necessário mapear as três.
Para criar um procedimento armazenado que leia em vez de atualizar dados, crie um que selecione todas as Course
entidades usando as seguintes instruções SQL:
CREATE PROCEDURE [dbo].[GetCourses]
AS
SELECT CourseID, Title, Credits, DepartmentID FROM dbo.Course
Adicionando os procedimentos armazenados ao modelo de dados
Os procedimentos armazenados agora são definidos no banco de dados, mas devem ser adicionados ao modelo de dados para disponibilizá-los ao Entity Framework. Abra SchoolModel.edmx, clique com o botão direito do mouse na superfície de design e selecione Atualizar Modelo no Banco de Dados. Na guia Adicionar da caixa de diálogo Escolher Seus Objetos de Banco de Dados , expanda Procedimentos Armazenados, selecione os procedimentos armazenados recém-criados e o DeletePerson
procedimento armazenado e clique em Concluir.
Mapeando os procedimentos armazenados
No designer de modelo de dados, clique com o botão direito do mouse na Student
entidade e selecione Mapeamento de Procedimento Armazenado.
A janela Detalhes do Mapeamento é exibida, na qual você pode especificar procedimentos armazenados que o Entity Framework deve usar para inserir, atualizar e excluir entidades desse tipo.
Defina a função Insert como InsertStudent. A janela mostra uma lista de parâmetros de procedimento armazenado, cada um dos quais deve ser mapeado para uma propriedade de entidade. Dois deles são mapeados automaticamente porque os nomes são os mesmos. Não há nenhuma propriedade de entidade chamada FirstName
, portanto, você deve selecionar FirstMidName
manualmente em uma lista suspensa que mostra as propriedades de entidade disponíveis. (Isso ocorre porque você alterou o nome da FirstName
propriedade para FirstMidName
no primeiro tutorial.)
Na mesma janela Detalhes de Mapeamento , mapeie a Update
função para o UpdateStudent
procedimento armazenado (especifique FirstMidName
como o valor do parâmetro para FirstName
, como você fez para o Insert
procedimento armazenado) e a Delete
função para o DeletePerson
procedimento armazenado.
Siga o mesmo procedimento para mapear os procedimentos armazenados de inserção, atualização e exclusão para instrutores para a Instructor
entidade.
Para procedimentos armazenados que leem em vez de atualizar dados, use a janela Navegador de Modelos para mapear o procedimento armazenado para o tipo de entidade retornado. No designer de modelo de dados, clique com o botão direito do mouse na superfície de design e selecione Navegador de Modelos. Abra o nó SchoolModel.Store e abra o nó Procedimentos Armazenados . Em seguida, clique com o botão direito do mouse no GetCourses
procedimento armazenado e selecione Adicionar Importação de Função.
Na caixa de diálogo Adicionar Importação de Função , em Retorna uma Coleção deEntidades selecionadas e selecione Course
como o tipo de entidade retornado. Quando terminar, clique em OK. Salve e feche o arquivo .edmx .
Usando inserir, atualizar e excluir procedimentos armazenados
Os procedimentos armazenados para inserir, atualizar e excluir dados são usados pelo Entity Framework automaticamente depois de adicioná-los ao modelo de dados e mapeá-los para as entidades apropriadas. Agora você pode executar a página StudentsAdd.aspx e sempre que criar um novo aluno, o Entity Framework usará o InsertStudent
procedimento armazenado para adicionar a nova linha à Student
tabela.
Execute a página Students.aspx e o novo aluno aparecerá na lista.
Altere o nome para verificar se a função de atualização funciona e exclua o aluno para verificar se a função delete funciona.
Usando Selecionar Procedimentos Armazenados
O Entity Framework não executa automaticamente procedimentos armazenados, como GetCourses
, e você não pode usá-los com o EntityDataSource
controle . Para usá-los, chame-os do código.
Abra o arquivo InstructorsCourses.aspx.cs . O PopulateDropDownLists
método usa uma consulta LINQ-to-Entities para recuperar todas as entidades do curso para que ele possa percorrer a lista e determinar a quais instrutores é atribuído e a quais não são atribuídos:
var allCourses = (from c in context.Courses
select c).ToList();
Substitua isso pelo seguinte código:
var allCourses = context.GetCourses();
A página agora usa o GetCourses
procedimento armazenado para recuperar a lista de todos os cursos. Execute a página para verificar se ela funciona como antes.
(As propriedades de navegação de entidades recuperadas por um procedimento armazenado podem não ser preenchidas automaticamente com os dados relacionados a essas entidades, dependendo ObjectContext
das configurações padrão. Para obter mais informações, consulte Carregando objetos relacionados no Biblioteca MSDN.)
No próximo tutorial, você aprenderá a usar a funcionalidade de Dados Dinâmicos para facilitar a programação e o teste de regras de formatação e validação de dados. Em vez de especificar em cada regra de página da Web, como cadeias de caracteres de formato de dados e se um campo é necessário ou não, você pode especificar essas regras nos metadados do modelo de dados e elas são aplicadas automaticamente em cada página.