Compartilhar via


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.

image15

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;

image14

Student as entidades têm quatro propriedades: PersonID, LastName, FirstNamee 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.

image20

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.

image21

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.

image22

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.)

image23

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.

image01

Siga o mesmo procedimento para mapear os procedimentos armazenados de inserção, atualização e exclusão para instrutores para a Instructor entidade.

image02

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.

image24

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 .

image25

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.

image03

Execute a página Students.aspx e o novo aluno aparecerá na lista.

image04

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.

image05

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.