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


Непосредственное выполнение команд хранилища

С помощью Entity Framework можно напрямую выполнять произвольные команды источников данных.

Команда store выполняется в контексте текущей транзакции, если она существует. Если соединение через ObjectContext не было открыто перед вызовом одного из следующих методов, Entity Framework открывает соединение перед выполнением запроса, а затем закрывает его после завершения выполнения запроса. Сведения о выполнении запроса см. в разделе Запросы объектов (платформа Entity Framework). Следующие методы относятся к типу ObjectContext. Примеры использования методов см. в разделе Как выполнять команды непосредственно в источнике данных. Ниже представлено назначение данных методов.

  • Метод ExecuteStoreCommand выполняет произвольную команду непосредственно в отношении источника данных, используя существующее соединение.

  • Метод System.Data.Objects.ObjectContext.ExecuteStoreQuery.String,System.Object[]) выполняет запрос непосредственно на источнике данных и возвращает последовательность типизированных результатов.

  • Метод System.Data.Objects.ObjectContext.ExecuteStoreQuery.String,System.String,System.Data.Objects.MergeOption,System.Object[]) выполняет запрос непосредственно на источнике данных и возвращает последовательность типизированных результатов в заданном наборе сущностей вместе с заданным параметром слияния, что позволяет отслеживать результаты запроса как сущности. Если набор сущностей не предоставлен, то результаты сущностей не отслеживаются.

  • Метод System.Data.Objects.ObjectContext.Translate.Data.Common.DbDataReader) преобразует DbDataReader, содержащий строки данных сущности, в объекты запрошенного типа сущности.

  • Метод System.Data.Objects.ObjectContext.Translate.Data.Common.DbDataReader,System.String,System.Data.Objects.MergeOption) преобразует DbDataReader, содержащий строки данных сущности, в объекты запрошенного типа сущности в заданном наборе сущностей и с заданным параметром слияния, который используется при добавлении преобразованных объектов к контексту объекта. Параметр AppendOnly является параметром слияния по умолчанию.

Материализация результирующего типа

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

Тип:

  • Не должен быть абстрактным.

  • Должен иметь конструктор по умолчанию.

Каждое свойство типа:

  • Должно иметь метод задания.

  • Должно соответствовать примитивному типу в CSDL.

  • Должно соответствовать имени столбца в результирующем DbDataReader (будут ли имена столбцов совпадать с именами свойств, определяется реализацией поставщика). Если имя свойства типа не соответствует полю DbDataReader, Entity Framework материализует значение свойства по умолчанию, если оно определено в концептуальной модели.

Работа с параметризованными командами

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

При вызове метода ExecuteStoreCommand или одного из перегруженных методов ExecuteQuery (ExecuteStoreQuery или ExecuteStoreQuery) и передаче аргументов commandText и parameters, Entity Framework создает новый экземпляр DbCommand, используя текущее соединение контекста объекта, и задает для свойства CommandText ** значение commandText, а для свойства Parameters — значение parameters. Значение parameters может быть массивом объектов DbParameter или массивом значений параметров. Если предоставлены только значения, массив объектов DbParameter создается на основе порядка значений в массиве. Соответствующий тип DbType для объекта параметра определяется базовым поставщиком на основе типа CLR. Имя ParameterName для каждого объекта параметра формируется в виде «pn», где n обозначает отсчитываемый от нуля порядковый номер аргумента параметра.

Например, следующие два вызова методов эквивалентны:

context.ExecuteStoreQuery<Product>("select * from Products where pid = {0}", 1);

context.ExecuteStoreQuery<Product>("select * from Products where pid = @p0", new SqlParameter { ParameterName = "p0", Value = 1 });

См. также

Задачи

Как выполнять команды непосредственно в источнике данных