Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Пример веб-приложения Университета 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, щелкните правой кнопкой мыши хранимые процедуры и выберите Добавить новую хранимую процедуру.
Скопируйте следующие инструкции 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;
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
процедуру, а затем нажмите кнопку Готово.
Сопоставление хранимых процедур
В конструкторе моделей данных щелкните правой Student
кнопкой мыши сущность и выберите Сопоставление хранимых процедур.
Откроется окно Сведения о сопоставлении , в котором можно указать хранимые процедуры, которые Entity Framework должна использовать для вставки, обновления и удаления сущностей этого типа.
Задайте для функции Insert значение InsertStudent. В окне отображается список параметров хранимой процедуры, каждый из которых должен быть сопоставлен со свойством сущности. Два из них сопоставляются автоматически, так как имена совпадают. Свойство сущности с именем FirstName
отсутствует, поэтому необходимо вручную выбрать FirstMidName
из раскрывающегося списка, в который отображаются доступные свойства сущности. (Это связано с тем, что вы изменили имя свойства FirstMidName
на FirstName
в первом руководстве.)
В том же окне Сведения о сопоставлении сопоставьте Update
функцию с UpdateStudent
хранимой процедурой (убедитесь, что вы указали FirstMidName
в качестве значения параметра для FirstName
, как и для Insert
хранимой процедуры), а Delete
функцию — с хранимой DeletePerson
процедурой.
Выполните ту же процедуру, чтобы сопоставить хранимые процедуры вставки, обновления и удаления для преподавателей с сущностью Instructor
.
Для хранимых процедур, которые считывают, а не обновляют данные, используйте окно Обозреватель моделей , чтобы сопоставить хранимую процедуру с типом сущности, который она возвращает. В конструкторе моделей данных щелкните правой кнопкой мыши область конструктора и выберите Обозреватель моделей. Откройте узел SchoolModel.Store , а затем узел Хранимые процедуры . Затем щелкните правой кнопкой мыши хранимую GetCourses
процедуру и выберите Добавить импорт функции.
В диалоговом окне Добавление импорта функции в разделе Возвращает коллекцию выберитеСущности, а затем выберите Course
в качестве возвращаемого типа сущности. Закончив, нажмите кнопку OK. Сохраните и закройте EDMX-файл .
Использование хранимых процедур вставки, обновления и удаления
Хранимые процедуры для вставки, обновления и удаления данных используются Платформой Entity Framework автоматически после их добавления в модель данных и сопоставления с соответствующими сущностями. Теперь можно запустить страницу StudentsAdd.aspx , и каждый раз, когда вы создаете нового учащегося, Entity Framework будет использовать InsertStudent
хранимую процедуру для добавления новой строки в таблицу Student
.
Запустите страницу Students.aspx , и новый учащийся появится в списке.
Измените имя, чтобы убедиться, что функция обновления работает, а затем удалите учащегося, чтобы убедиться, что функция удаления работает.
Использование выборки хранимых процедур
Платформа 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.)
В следующем руководстве вы узнаете, как использовать функции динамических данных, чтобы упростить программирование и тестирование правил форматирования и проверки данных. Вместо того, чтобы указывать правила для каждой веб-страницы, например строки формата данных, и указывать, является ли поле обязательным, можно указать такие правила в метаданных модели данных, и они автоматически применяются на каждой странице.