Поделиться через


начало работы с entity Framework 4.0 Database First и ASP.NET 4 веб-формы — часть 7

Том Дайкстра (Tom Dykstra)

Пример веб-приложения Университета Contoso демонстрирует создание ASP.NET Web Forms приложений с помощью Entity Framework 4.0 и Visual Studio 2010. Сведения о серии учебников см. в первом руководстве этой серии.

Использование хранимых процедур

В предыдущем руководстве вы реализовали шаблон наследования таблицы на иерархию. В этом руководстве показано, как использовать хранимые процедуры для получения большего контроля над доступом к базе данных.

Платформа Entity Framework позволяет указать, что она должна использовать хранимые процедуры для доступа к базе данных. Для любого типа сущности можно указать хранимую процедуру, используемую для создания, обновления или удаления сущностей этого типа. Затем в модели данных можно добавить ссылки на хранимые процедуры, которые можно использовать для выполнения таких задач, как извлечение наборов сущностей.

Использование хранимых процедур является распространенным требованием для доступа к базе данных. В некоторых случаях администратор базы данных может потребовать, чтобы доступ к базе данных проходил через хранимые процедуры по соображениям безопасности. В других случаях может потребоваться встроить бизнес-логику в некоторые процессы, которые Entity Framework использует при обновлении базы данных. Например, при удалении сущности может потребоваться скопировать ее в архивную базу данных. Или при каждом обновлении строки может потребоваться записать строку в таблицу ведения журнала, в которой записываются лица, вносившие изменения. Такие задачи можно выполнять в хранимой процедуре, которая вызывается всякий раз, когда Entity Framework удаляет сущность или обновляет сущность.

Как и в предыдущем руководстве, вы не будете создавать новые страницы. Вместо этого вы измените способ доступа Entity Framework к базе данных для некоторых уже созданных страниц.

В этом руководстве вы создадите хранимые процедуры в базе данных для вставки сущностей Student и Instructor . Вы добавите их в модель данных и укажете, что Платформа Entity Framework должна использовать их для добавления Student сущностей и Instructor в базу данных. Вы также создадите хранимую процедуру, которую можно использовать для извлечения Course сущностей.

Создание хранимых процедур в базе данных

(Если вы используете файл School.mdf из проекта, доступного для скачивания в этом руководстве, этот раздел можно пропустить, так как хранимые процедуры уже существуют.)

В Обозреватель сервера разверните узел School.mdf, щелкните правой кнопкой мыши хранимые процедуры и выберите Добавить новую хранимую процедуру.

image15

Скопируйте следующие инструкции SQL и вставьте их в окно хранимой процедуры, заменив структуру хранимой процедуры.

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 Сущности имеют четыре свойства: PersonID, LastName, FirstNameи EnrollmentDate. База данных автоматически создает значение идентификатора, а хранимая процедура принимает параметры для остальных трех. Хранимая процедура возвращает значение ключа записи новой строки, чтобы Платформа Entity Framework хранящейся в памяти версии сущности.

Сохраните и закройте окно хранимой процедуры.

Создайте хранимую InsertInstructor процедуру таким же образом, используя следующие инструкции 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;

Также создайте Update хранимые процедуры для Student сущностей и Instructor . (База данных уже содержит хранимую DeletePerson процедуру, которая будет работать как для сущностей, так Instructor и 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;

В этом руководстве вы сопоставьте все три функции — вставку, обновление и удаление — для каждого типа сущности. Entity Framework версии 4 позволяет сопоставить только одну или две из этих функций с хранимыми процедурами, не сопоставляя другие, за одним исключением: при сопоставлении функции обновления, но не функции удаления, Entity Framework создаст исключение при попытке удалить сущность. В Entity Framework версии 3.5 у вас не было такой гибкости в сопоставлении хранимых процедур: если вы сопоставили одну функцию, вам требовалось сопоставить все три функции.

Чтобы создать хранимую процедуру, которая считывает, а не обновляет данные, создайте процедуру, которая выбирает все Course сущности, используя следующие инструкции SQL:

CREATE PROCEDURE [dbo].[GetCourses]
            AS
            SELECT CourseID, Title, Credits, DepartmentID FROM dbo.Course

Добавление хранимых процедур в модель данных

Хранимые процедуры теперь определены в базе данных, но их необходимо добавить в модель данных, чтобы сделать их доступными для Entity Framework. Откройте SchoolModel.edmx, щелкните правой кнопкой мыши область конструктора и выберите Обновить модель из базы данных. На вкладке Добавить диалогового окна Выбор объектов базы данных разверните узел Хранимые процедуры, выберите только что созданные хранимые процедуры и хранимую DeletePerson процедуру, а затем нажмите кнопку Готово.

image20

Сопоставление хранимых процедур

В конструкторе моделей данных щелкните правой Student кнопкой мыши сущность и выберите Сопоставление хранимых процедур.

image21

Откроется окно Сведения о сопоставлении , в котором можно указать хранимые процедуры, которые Entity Framework должна использовать для вставки, обновления и удаления сущностей этого типа.

image22

Задайте для функции Insert значение InsertStudent. В окне отображается список параметров хранимой процедуры, каждый из которых должен быть сопоставлен со свойством сущности. Два из них сопоставляются автоматически, так как имена совпадают. Свойство сущности с именем FirstNameотсутствует, поэтому необходимо вручную выбрать FirstMidName из раскрывающегося списка, в который отображаются доступные свойства сущности. (Это связано с тем, что вы изменили имя свойства FirstMidName на FirstName в первом руководстве.)

image23

В том же окне Сведения о сопоставлении сопоставьте Update функцию с UpdateStudent хранимой процедурой (убедитесь, что вы указали FirstMidName в качестве значения параметра для FirstName, как и для Insert хранимой процедуры), а Delete функцию — с хранимой DeletePerson процедурой.

image01

Выполните ту же процедуру, чтобы сопоставить хранимые процедуры вставки, обновления и удаления для преподавателей с сущностью Instructor .

image02

Для хранимых процедур, которые считывают, а не обновляют данные, используйте окно Обозреватель моделей , чтобы сопоставить хранимую процедуру с типом сущности, который она возвращает. В конструкторе моделей данных щелкните правой кнопкой мыши область конструктора и выберите Обозреватель моделей. Откройте узел SchoolModel.Store , а затем узел Хранимые процедуры . Затем щелкните правой кнопкой мыши хранимую GetCourses процедуру и выберите Добавить импорт функции.

image24

В диалоговом окне Добавление импорта функции в разделе Возвращает коллекцию выберитеСущности, а затем выберите Course в качестве возвращаемого типа сущности. Закончив, нажмите кнопку OK. Сохраните и закройте EDMX-файл .

image25

Использование хранимых процедур вставки, обновления и удаления

Хранимые процедуры для вставки, обновления и удаления данных используются Платформой Entity Framework автоматически после их добавления в модель данных и сопоставления с соответствующими сущностями. Теперь можно запустить страницу StudentsAdd.aspx , и каждый раз, когда вы создаете нового учащегося, Entity Framework будет использовать InsertStudent хранимую процедуру для добавления новой строки в таблицу Student .

image03

Запустите страницу Students.aspx , и новый учащийся появится в списке.

image04

Измените имя, чтобы убедиться, что функция обновления работает, а затем удалите учащегося, чтобы убедиться, что функция удаления работает.

image05

Использование выборки хранимых процедур

Платформа Entity Framework не выполняет автоматически хранимые процедуры, такие как GetCourses, и их нельзя использовать с элементом EntityDataSource управления . Чтобы использовать их, вы вызываете их из кода.

Откройте файл InstructorsCourses.aspx.cs . Метод PopulateDropDownLists использует запрос LINQ to-Entities для получения всех сущностей курса, чтобы он смог циклически просмотреть список и определить, какие из них назначены инструктору, а какие не назначены:

var allCourses = (from c in context.Courses
                  select c).ToList();

Замените его следующим кодом:

var allCourses = context.GetCourses();

Теперь на странице используется хранимая GetCourses процедура для получения списка всех курсов. Запустите страницу, чтобы убедиться, что она работает так же, как и раньше.

(Свойства навигации сущностей, полученных хранимой процедурой, могут не заполняться автоматически данными, связанными с этими сущностями, в зависимости ObjectContext от параметров по умолчанию. Дополнительные сведения см. в разделе Загрузка связанных объектов в библиотека MSDN.)

В следующем руководстве вы узнаете, как использовать функции динамических данных, чтобы упростить программирование и тестирование правил форматирования и проверки данных. Вместо того, чтобы указывать правила для каждой веб-страницы, например строки формата данных, и указывать, является ли поле обязательным, можно указать такие правила в метаданных модели данных, и они автоматически применяются на каждой странице.