Что такое ado net
Обзор Entity Framework
Entity Framework — это набор технологий в ADO.NET, которые поддерживают разработку программных приложений, ориентированных на данные. Архитекторам и разработчикам приложений, ориентированных на обработку данных, приходится учитывать необходимость достижения двух совершенно различных целей. Они должны моделировать сущности, связи и логику решаемых бизнес-задач, а также работать с ядрами СУБД, используемыми для сохранения и получения данных. Данные могут распределяться по нескольким системам хранения данных, в каждой из которых применяются свои протоколы, но даже в приложениях, работающих с одной системой хранения данных, необходимо поддерживать баланс между требованиями системы хранения данных и требованиями написания эффективного и удобного для обслуживания кода приложения.
Предоставление жизненного цикла моделям
Многолетним и общим подходом к разработке является подход, при котором построение приложения или службы представляет собой его разделение на три части: модель домена, логическую модель и физическую модель. Модель домена определяет сущности и связи в моделируемой системе. Логическая модель для реляционной базы данных обеспечивает нормализацию сущностей и связей в целях создания таблиц с ограничениями внешнего ключа. В физической модели учитываются возможности конкретной системы обработки данных путем определения зависящих от ядра базы данных подробных сведений о хранении данных, которые касаются секционирования и индексирование.
Физическая модель совершенствуется администраторами базы данных в целях повышения производительности, но программисты, которые разрабатывают код приложения, в основном вынуждены ограничиваться работой с логической моделью, подготавливая SQL-запросы и вызывая хранимые процедуры. Модели домена в основном используются как инструмент для представления и обмена мнениями о требованиях к приложению, поэтому чаще всего служат в качестве практически не изменяющихся схем, которые рассматриваются и обсуждаются на ранних стадиях проекта, после чего выходят из сферы внимания. Во многих коллективах разработчиков принято пропускать этап создания концептуальной модели и начинать с определения таблиц, столбцов и ключей в реляционной базе данных.
Entity Framework дает жизнь модели, позволяя разработчикам запрашивать сущности и связи в модели предметной области (называемой концептуальной моделью в Entity Framework), в то же время полагаться на Entity Framework преобразования этих операций в команды, относящиеся к источнику данных. Это позволяет отказаться от применения в приложениях жестко заданных зависимостей от конкретного источника данных.
При работе в режиме Code First концептуальная модель сопоставлена с режимом хранения в коде. Entity Framework может вычислять концептуальную модель на основе типов объектов и дополнительных конфигураций, которые вы определяете. Метаданные сопоставления формируются во время выполнения на основе сочетания определений типов домена и дополнительной информации о конфигурации, которая указана в коде. Entity Framework создает базу данных по мере необходимости на основе метаданных. Дополнительные сведения см. в разделе Создание модели.
При работе со средствами работы с моделью EDM концептуальная модель, модель хранения и сопоставление между ними выражены в схемах на основе XML и определены в файлах с именами с соответствующими расширениями.
Модель хранения и сопоставления при необходимости могут быть изменены без изменения концептуальной модели, классов данных и кода приложения. Модели хранения зависят от поставщика, поэтому можно работать с согласованной концептуальной моделью через различные источники данных.
Entity Framework использует эти файлы модели и сопоставления для создания, чтения, обновления и удаления операций с сущностями и связями в концептуальной модели в эквивалентных операциях в источнике данных. Entity Framework даже поддерживает сопоставление сущностей в концептуальной модели с хранимыми процедурами в источнике данных. Дополнительные сведения см. в статье спецификации на языке CSDL, SSDL и MSL.
Сопоставьте объекты с данными
В существующих решениях была предпринята попытка устранить этот разрыв, часто называемый «несоответствием типов данных» (impedance mismatch), путем сопоставления с реляционными таблицами и столбцами только объектно-ориентированных классов и свойств. Вместо использования этого традиционного подхода Entity Framework сопоставляет реляционные таблицы, столбцы и ограничения внешнего ключа в логических моделях с сущностями и связями в концептуальных моделях. Это позволяет достичь большей гибкости при определении объектов и оптимизации логической модели. Средства EDM создают расширяемые классы данных на основе концептуальной модели. Эти классы являются разделяемыми классами, которые могут быть расширены с помощью дополнительных членов, добавленных разработчиком. По умолчанию классы, сформированные для определенной концептуальной модели, являются производными от базовых классов, предоставляющих службы для материализации сущностей в виде объектов, а также для отслеживания и сохранения изменений. Разработчики могут использовать эти три класса для работы с сущностями и связями как с объектами, относящимися к ассоциациям. Разработчики смогут также настраивать классы, сформированные для концептуальной модели. Дополнительные сведения см. в разделе Работа с объектами.
Доступ и изменение данных сущности
Платформа Entity Framework — это не просто еще одно средство объектно-реляционного сопоставления. Ее цель — предоставить приложениям возможность чтения и изменения данных, представленных в виде сущностей и связей в концептуальной модели. Entity Framework использует сведения в файлах модели и сопоставления для преобразования запросов объектов в типы сущностей, представленные в концептуальной модели, в запросы, относящиеся к источникам данных. Результаты запроса собиваются на объекты, которыми управляет Entity Framework. Entity Framework предоставляет следующие способы запроса концептуальной модели и возврата объектов.
LINQ to Entities. Обеспечивает поддержку запросов LINQ для выполнения запросов к типам сущности, которые определены в концептуальной модели. дополнительные сведения см. в разделе LINQ to Entities.
Entity SQL. независимый от хранилища диалект SQL, который работает непосредственно с сущностями в концептуальной модели и поддерживает EDM концепции. Entity SQL используется как с запросами объектов, так и с запросами, которые выполняются с помощью поставщика EntityClient. дополнительные сведения см. в разделе Entity SQL обзор.
Entity Framework включает поставщик данных EntityClient. Этот поставщик управляет соединениями, преобразует запросы сущностей в запросы, зависящие от источника данных, и возвращает модуль чтения данных, который Entity Framework использует для материализации данных сущности в объекты. если материализация объекта не требуется, поставщик EntityClient можно также использовать как стандартный ADO.NET поставщик данных, позволяя приложениям выполнять запросы Entity SQL и использовать возвращенный модуль чтения данных только для чтения. Дополнительные сведения см. в разделе Поставщик EntityClient для Entity Framework.
На следующей схеме показана архитектура, применяемая в платформе Entity Framework для доступа к данным.
Поставщики данных
EntityClient поставщик расширяет модель поставщика ADO.NET путем доступа к данным с точки зрения концептуальных сущностей и связей. Он выполняет запросы, использующие Entity SQL. Entity SQL предоставляет базовый язык запросов, который позволяет EntityClient взаимодействовать с базой данных. Дополнительные сведения см. в разделе Поставщик EntityClient для Entity Framework.
Entity Framework включает обновленный поставщик данных SqlClient, который поддерживает канонические деревья команд. Дополнительные сведения см. в разделе SqlClient для Entity Framework.
Средства модели EDM
вместе со средой выполнения Entity Framework Visual Studio включает средства сопоставления и моделирования. Дополнительные сведения см. в разделе моделирование и сопоставление.
Дополнительные сведения
Дополнительные сведения о Entity Framework см. в следующих статьях:
Начало работы — содержит сведения о том, как быстро начать работу с помощью краткого руководства, в котором показано, как создать простое приложение Entity Framework.
Entity Framework терминология определяет множество терминов, которые появились EDM и Entity Framework и используются в документации Entity Framework.
Entity Framework ресурсы — ссылки на основные разделы и ссылки на внешние разделы и ресурсы для создания Entity Framework приложений.
Доступ к данным с помощью ADO.NET (C++/CLI)
ADO.NET выполняется в среде clr. таким образом, любое приложение, взаимодействующее с ADO.NET, должно также ориентироваться на среду CLR. Однако это не означает, что собственные приложения не могут использовать ADO.NET. в этих примерах показано, как взаимодействовать с ADO.NET базой данных из машинного кода.
Маршалирование строк ANSI для ADO.NET
Демонстрирует, как добавить собственную строку ( char * ) в базу данных и как маршалировать char * из базы данных в собственную строку.
Пример
в этом примере создается класс датабасекласс для взаимодействия с объектом datatable ADO.NET. Обратите внимание, что этот класс является машинным кодом C++ class (по сравнению с ref class или value class ). Это необходимо, поскольку мы хотим использовать этот класс из машинного кода, и вы не можете использовать управляемые типы в машинном коде. Этот класс будет скомпилирован для среды CLR, как указано в #pragma managed директиве, предшествующей объявлению класса. Дополнительные сведения об этой директиве см. в разделе управляемые, неуправляемые.
Компиляция кода
Чтобы скомпилировать код из командной строки, сохраните пример кода в файле с именем adonet_marshal_string_native. cpp и введите следующую инструкцию:
Маршалирование строк BSTR для ADO.NET
Пример
в этом примере создается класс датабасекласс для взаимодействия с объектом datatable ADO.NET. Обратите внимание, что этот класс является машинным кодом C++ class (по сравнению с ref class или value class ). Это необходимо, поскольку мы хотим использовать этот класс из машинного кода, и вы не можете использовать управляемые типы в машинном коде. Этот класс будет скомпилирован для среды CLR, как указано в #pragma managed директиве, предшествующей объявлению класса. Дополнительные сведения об этой директиве см. в разделе управляемые, неуправляемые.
Компиляция кода
Чтобы скомпилировать код из командной строки, сохраните пример кода в файле с именем adonet_marshal_string_native. cpp и введите следующую инструкцию:
Маршалирование строк Юникода для ADO.NET
Демонстрирует, как добавить собственную строку в Юникоде ( wchar_t * ) в базу данных и как маршалировать wchar_t * из базы данных в собственную строку в Юникоде.
Пример
в этом примере создается класс датабасекласс для взаимодействия с объектом datatable ADO.NET. Обратите внимание, что этот класс является машинным кодом C++ class (по сравнению с ref class или value class ). Это необходимо, поскольку мы хотим использовать этот класс из машинного кода, и вы не можете использовать управляемые типы в машинном коде. Этот класс будет скомпилирован для среды CLR, как указано в #pragma managed директиве, предшествующей объявлению класса. Дополнительные сведения об этой директиве см. в разделе управляемые, неуправляемые.
Компиляция кода
Чтобы скомпилировать код из командной строки, сохраните пример кода в файле с именем adonet_marshal_string_wide. cpp и введите следующую инструкцию:
Маршалирование варианта для ADO.NET
Пример
в этом примере создается класс датабасекласс для взаимодействия с объектом datatable ADO.NET. Обратите внимание, что этот класс является машинным кодом C++ class (по сравнению с ref class или value class ). Это необходимо, поскольку мы хотим использовать этот класс из машинного кода, и вы не можете использовать управляемые типы в машинном коде. Этот класс будет скомпилирован для среды CLR, как указано в #pragma managed директиве, предшествующей объявлению класса. Дополнительные сведения об этой директиве см. в разделе управляемые, неуправляемые.
Компиляция кода
Чтобы скомпилировать код из командной строки, сохраните пример кода в файле с именем adonet_marshal_variant. cpp и введите следующую инструкцию:
Маршалирование SAFEARRAY для ADO.NET
Пример
в этом примере создается класс датабасекласс для взаимодействия с объектом datatable ADO.NET. Обратите внимание, что этот класс является машинным кодом C++ class (по сравнению с ref class или value class ). Это необходимо, поскольку мы хотим использовать этот класс из машинного кода, и вы не можете использовать управляемые типы в машинном коде. Этот класс будет скомпилирован для среды CLR, как указано в #pragma managed директиве, предшествующей объявлению класса. Дополнительные сведения об этой директиве см. в разделе управляемые, неуправляемые.
Компиляция кода
Чтобы скомпилировать код из командной строки, сохраните пример кода в файле с именем adonet_marshal_safearray. cpp и введите следующую инструкцию:
Основные принципы ADO
ADO предоставляет разработчикам мощную, логическую объектную модель для программного доступа, редактирования и обновления данных из разнообразных источников данных с помощью OLE DB системных интерфейсов. Наиболее распространенным применением ADO является запрос таблицы или таблиц в реляционной базе данных, получение и отображение результатов в приложении и, возможно, предоставление пользователям доступа и сохранение изменений в данных. К другим задачам относятся следующие.
выполнение запросов к базе данных с помощью SQL и отображение результатов.
Доступ к информации в хранилище файлов через Интернет.
Управление сообщениями и папками в системе электронной почты.
Сохранение данных из базы данных в XML-файл.
Выполняя команды, описанные в XML и получая XML-поток.
Сохранение данных в двоичный или XML-поток.
Предоставление пользователю возможности просмотра и изменения данных в таблицах базы данных.
Создание и повторное использование параметризованных команд базы данных.
Выполнению хранимых процедур.
Динамическое создание гибкой структуры, именуемой набором записей, для хранения, перемещения и управления данными.
Выполнение операций с транзакционными базами данных.
Фильтрация и сортировка локальных копий сведений о базе данных на основе критериев времени выполнения.
Создание иерархических результатов из баз данных и управление ими.
Привязка полей базы данных к компонентам, поддерживающим данные.
Создание удаленных, отключенных наборов записей.
ADO предоставляет широкий спектр параметров и параметров для обеспечения такой гибкости. Поэтому важно принять методическийный подход к использованию ADO в приложении, разбивая все цели на управляемые части.
В большинстве приложений, использующих ADO, участвуют четыре основные операции: получение данных, проверка данных, изменение данных и обновление данных. Эти операции рассматриваются более подробно далее в этом разделе.
тем не менее, прежде чем обсуждать эти детали, мы представим обзор объектной модели ado и простого приложения ado, написанного на® Microsoft Visual Basic® и выполняющего каждую из четырех основных операций ADO:
примеры кода ADO.NET
в листингах кода на этой странице показано, как получить данные из базы данных с помощью следующих ADO.NET технологий:
Поставщики данных ADO.NET:
Платформа ADO.NET Entity Framework:
примеры поставщика данных ADO.NET
SqlClient
Код в этом примере предполагает, что вы можете подключиться к Northwind образцу базы данных на Microsoft SQL Server. Код создает команду SqlCommand для выборки строк из таблицы Products, к которой добавляется параметр SqlParameter, ограничивающий результат строками, для которых значение UnitPrice превышает указанное значение параметра, в данном случае 5. Объект SqlConnection открывается внутри using блока, который гарантирует, что ресурсы закрываются и удаляются при выходе из кода. Команда выполняется с помощью объекта SqlDataReader, а результаты выводятся в окно консоли.
OleDb
Данный образец кода предполагает возможность подключения к образцу базы данных Northwind из Microsoft Access. Код создает команду OdbcCommand для выборки строк из таблицы Products, к которой добавляется параметр OdbcParameter, ограничивающий результат строками, для которых значение UnitPrice превышает указанное значение параметра, в данном случае 5. Объект OdbcConnection открывается внутри using блока, который гарантирует, что ресурсы закрываются и удаляются при выходе из кода. Команда выполняется с помощью объекта OdbcDataReader, а результаты выводятся в окно консоли.
OracleClient
Данный пример кода предполагает наличие соединения с базой данных DEMO.CUSTOMER на сервере Oracle. Кроме того, необходимо добавить ссылку на файл System.Data.OracleClient.dll. Этот код возвращает данные в объекте OracleDataReader.
Примеры Entity Framework
В приведенных ниже листингах кода демонстрируется извлечение данных из источника данных путем выполнения запросов к сущностям модели EDM. В этих примерах используется модель, основанная на образце базы данных Northwind. Дополнительные сведения о Entity Framework см. в разделе Общие сведения о Entity Framework.
LINQ to Entities
В данном примере кода запрос LINQ используется для возврата данных в виде объектов Categories, которые проецируются в анонимный тип, содержащий только свойства CategoryID и CategoryName. дополнительные сведения см. в разделе LINQ to Entities обзор.
Типизированный запрос ObjectQuery
EntityClient
В данном примере кода для выполнения запроса Entity SQL используется команда EntityCommand. Этот запрос возвращает список записей, представляющих экземпляры типа сущности Categories. Для доступа к записям данных в результирующем наборе используется объект EntityDataReader. Дополнительные сведения см. в разделе Поставщик EntityClient для Entity Framework.
LINQ to SQL
В данном примере кода запрос LINQ используется для возврата данных в виде объектов Categories, которые проецируются в анонимный тип, содержащий только свойства CategoryID и CategoryName. Этот пример основан на контексте данных Northwind. Дополнительные сведения см. в разделе Начало работы.
Архитектура ADO.NET
В ADO.NET используется многоуровневая архитектура, которая обращается вокруг небольшого числа ключевых концепций, таких как объекты Connection, Command и DataSet. Однако архитектура ADO.NET серьезно отличается от классической архитекуры ADO.
Поставщики данных в ADO.NET
— это набор классов ADO.NET, которые позволяют получать доступ к определенной базе данных, выполнять команды SQL и извлекать данные. По сути, поставщик данных — это мост между вашим приложением и источником данных.
В первом приближении поставщик данных можно рассматривать как набор типов, определенных в данном пространстве имен, который предназначен для взаимодействия с конкретным источником данных. Однако независимо от используемого поставщика данных, каждый из них определяет набор классов, обеспечивающих основную функциональность. В таблице ниже приведены некоторые общие основные объекты, их базовые классы (определенные в пространстве имен System.Data.Common) и основные интерфейсы (определенные в пространстве имен System.Data), которые они реализуют:
Тип объекта | Базовый класс | Соответствующие интерфейсы | Назначение |
---|---|---|---|
Connection | DbConnection | IDbConnection | Позволяет подключаться к хранилищу данных и отключаться от него. Кроме того, объекты подключения обеспечивают доступ к соответствующим объектам транзакций |
Command | DbCommand | IDbCommand | Представляет SQL-запрос или хранимую процедуру. Кроме того, объекты команд предоставляют доступ к объекту чтения данных конкретного поставщика данных |
DataReader | DbDataReader | IDataReader, IDataRecord | Предоставляет доступ к данным только для чтения в прямом направлении с помощью курсора на стороне сервера |
DataAdapter | DbDataAdapter | IDataAdapter, IDbDataAdapter | Пересылает наборы данных из хранилища данных к вызывающему процессу и обратно. Адаптеры данных содержат подключение и набор из четырех внутренних объектов команд для выборки, вставки, изменения и удаления информации в хранилище данных |
Parameter | DbParameter | IDataParameter, IDbDataParameter | Представляет именованный параметр в параметризованном запросе |
Transaction | DbTransaction | IDbTransaction | Инкапсулирует транзакцию в базе данных |
Конкретные имена этих основных классов различаются у различных поставщиков (например, SqlConnection, OracleConnection, OdbcConnection и MySqlConnection), но все эти объекты порождены от одного и того же базового класса (в случае объектов подключения это DbConnection), который реализует идентичные интерфейсы (вроде IDbConnection). Поэтому если вы научитесь работать с одним поставщиком данных, то легко справитесь и с остальными.
В ADO.NET термин «объект подключения» на самом деле относится к конкретному типу, порожденному от DbConnection; объекта подключения «вообще» нет. То же можно сказать и об «объекте команды», «объекте адаптера данных» и т.д. По соглашению имена объектов в конкретном поставщике данных имеют префиксы соответствующей СУБД (например, SqlConnection, OracleConnection, SqlDataReader и т.д.).
SQL Server
Предоставляет оптимизированный доступ к базам данных SQL Server (версии 7.0 и выше).
OLE DB
Предоставляет доступ к любому источнику данных, который имеет драйвер OLE DB. Это включает базы данных SQL Server версий, предшествующих 7.0.
Oracle
Предоставляет оптимизированный доступ к базам данных Oracle (версии 8i и выше).
ODBC
Предоставляет доступ к любому источнику данных, имеющему драйвер ODBC.
На рисунке ниже показаны уровни модели поставщиков ADO.NET:
Стандартизация в ADO.NET
На первый взгляд может показаться, что ADO.NET предлагает фрагментированную модель, поскольку не включает обобщенного набора объектов, которые работали бы с множеством типов баз данных. В результате, когда вы переходите от одной реляционной СУБД к другой, приходится модифицировать код доступа к данным для использования другого набора классов.
«За кулисами» различные поставщики используют совершенно разные низкоуровневые вызовы и API-интерфейсы. Например, поставщик данных SQL Server применяет патентованный протокол для взаимодействия с сервером. Преимущества этой модели не сразу очевидны, но весьма существенны:
Поскольку каждый поставщик использует одни и те же интерфейсы и базовые классы, можно писать обобщенный код доступа к данным (с приложением небольших дополнительных усилий), работая с интерфейсами, а не классами поставщиков.
Поскольку каждый поставщик реализован отдельно, он может использовать соответствующую оптимизацию (это отличается от модели ADO, где каждый вызов базы данных должен проходить через общий уровень, прежде чем достигнет лежащего в основе драйвера базы данных). Кроме того, специализированные поставщики могут добавлять нестандартные средства, которых не имеют другие поставщики (например, возможность SQL Sever выполнять XML-запросы).
ADO.NET также имеет другой уровень стандартизации — DataSet. Класс DataSet — это контейнер данных общего назначения, которые извлекаются из одной или более таблиц источника данных. DataSet полностью обобщен; другими словами, специализированные поставщики не определяют собственных специализированных версий класса DataSet.
Независимо от того, какой поставщик данных применяется, можно извлекать данные и помещать их в полностью автономный DataSet одинаковым образом. Это облегчает отделение кода, извлекающего данные, от кода, обрабатывающего их. В случае смены лежащей в основе базы данных придется изменить только код, извлекающий данные, но если используется DataSet, а информация имеет одну и ту же структуру, модифицировать способ ее обработки не понадобится.
Фундаментальные классы ADO.NET
Классы ADO.NET группируются в несколько пространств имен. Каждый поставщик имеет свое собственное пространство имен, а обобщенные классы вроде DataSet находятся в пространстве имен System.Data. Ниже описаны наиболее важные пространства имен для базовой поддержки ADO.NET:
System.Data
Содержит ключевые классы контейнеров данных, которые моделируют столбцы, отношения, таблицы, наборы данных, строки, представления и ограничения. Дополнительно содержит ключевые интерфейсы, которые реализованы объектами данных, основанными на соединениях
System.Data.Common
Содержит базовые, наиболее абстрактные классы, которые реализуют некоторые из интерфейсов из System.Data и определяют ядро функциональности ADO.NET. Поставщики данных наследуются от этих классов (DbConnection, DbCommand и т.п.), создавая собственные специализированные версии
System.Data.OleDb
Содержит классы, используемые для подключения к поставщику OLE DB, включая OleDbCommand, OleDbConnection и OleDbDataAdapter. Эти классы поддерживают большинство поставщиков OLE DB, но не те, что требуют интерфейсов OLE DB версии 2.5
System.Data.SqlClient
Содержит классы, используемые для подключения к базе данных Microsoft SQL Server, в том числе SqlDbCommand, SqlDbConnection и SqlDbDataAdapter. Эти классы оптимизированы для использования интерфейса TDS к SQL Server
System.Data.OracleClient
Содержит классы, необходимые для подключения к базе данных Oracle (версии 8.1.7 и выше), в том числе OracleCommand, OracleConnection и OracleDataAdapter. Эти классы используют оптимизированный интерфейс OCI (Oracle Call Interface — Интерфейс вызовов Oracle)
System.Data.Odbc
Содержит классы, необходимые для подключения к большинству драйверов ODBC, такие как OdbcCommand, OdbcConnection, OdbcDataReader и OdbcDataAdapter. Драйверы ODBC поставляются для всех видов источников данных и конфигурируются через значок Data Sources (Источники данных) панели управления
System.Data.SqlTypes