подключенная модель и отключенная модель в EF
Я смущен много о подключенной модели и отключен в entity framework .
я использовал традиционный ADO.net (DataReader
для подключенной модели, а DataAdapter
для отключения модели)
и все, что я знаю, что я использую подключенную модель, когда у меня много пользователей, нужно обновить или вставить вместе, а отключенная модель в нескольких случаях, когда мне нужно отправить данные в другой процесс, сделать некоторые операции с данными в памяти и отправить их обратно в БД .
теперь Я прочитал несколько статей о подключенной модели и отключенной модели в EF, и я смущен, почему я должен явно присоединять сущности к контексту в отключенной модели ? Я также читал, что поведение по умолчанию в web-это отключенная модель, а в WPF-подключенная модель !
- может ли кто-нибудь легко объяснить аналогию с реальной жизнью в чем разница между двумя моделями?
- как мы смогли отрегулировать обе модели в эф с простым пример?
- существует ли связь между типом приложения (веб-форма , MVC, WPF, WCF) и выделенная модель, используемая в EF?
- когда использовать подключенную модель и когда использовать отключенную модель (используя EF) ?
2 ответов
Фон
ADO.NET рамки поддерживает две модели архитектуры доступа к данным:
- Подключение Ориентированный
- отключен
В Соединении Ориентированная Архитектура Доступа К Данным приложение подключается к источнику данных, а затем взаимодействует с ним через SQL-запросы использование того же соединения (например, необходимо поддерживать открытое соединение между вашим приложением и источником данных, даже если он не использует никаких операций с базой данных).
подключенная архитектура - это когда вы постоянно совершаете поездки в базу данных для любой операции CRUD (Create, Read, Update и Delete), которую вы хотите сделать. Это создает больше трафика в базу данных, но обычно намного быстрее, так как вы должны делать меньшие транзакции.
он построен на классы Connection
, Command
, DataReader
и Transaction
.
В Отключенной Архитектуре Доступа К Данным ADO.net использует хранилище данных в памяти, которое может содержать несколько таблиц одновременно (они извлекаются раньше).
Disconnected architecture-это метод извлечения набора записей из базы данных и его хранения, позволяющий выполнять множество операций CRUD (Create, Read, Update и Delete) над данными в памяти, тогда это может быть повторная синхронизация с базой данных при повторном подключении.
он построен на классы Connection
, DataAdapter
, CommandBuilder
, DataSet
и DataView
.
некоторые ключевые классы подключенной и отключенной архитектуры
-
DataReader
is Подключен Архитектуры так как он держит соединение открыто, пока все строки не будут извлечены один за другим. -
DataSet
и отключен Архитектура так как все записи принесено сразу, и нет необходимости поддерживать связь. -
DataAdapter
действует как мост между Соединенным и Отключенные Объекты. Он управляет соединениями между источником данных иDataset
путем заполнения данных из источника данных вDataset
.
какой из них лучше в желаемой ситуации?
Режим Подключения
- подключение ориентированный
- мы читаем данные из базы данных с помощью
DataReader
объект - его методы обеспечивают более высокую производительность
- он может содержать данные одной таблицы
- это только для чтения, мы не можем обновлять данные
отключенном режиме
- это отключенное соединение ориентировано.
- мы читаем данные из базы данных с помощью
ADO.Net
'Connected' и 'disconnected' в ADO.Net are о подключении к базе данных. А DataReader
всегда открытой связи DataSet
/DataAdapter
duo подключается к базе данных при необходимости.
Я думаю, что общая аналогия в реальной жизни делает телефонный звонок. Если вы хотите, чтобы друг говорил с вами по дороге домой, пока вы едете, вы предпочтете "подключенный режим": во время телефонного звонка вы говорите туда и обратно, пока не окажетесь там. Было бы слишком много времени, чтобы начать новый телефонный звонок для каждой инструкции.
Но если ты попросишь свою мать, живущую в двух кварталах отсюда, проверить, закрыл ли ты кухонное окно, ты позвонишь ей, и она проверит и перезвонит тебе: "отключен". Тем временем вы продолжите делать то, что делали раньше.
в этом смысле Entity Framework всегда работает в отключенном режиме. Каждая операция базы данных EF открывает и закрывает соединение с базой данных (если вы явно переопределить это поведение).
архитектура программного обеспечения
но в архитектуре программного обеспечения "подключено" и "отключено" обычно относятся к 1-ярус против N-яруса. В одноуровневом приложении, например в приложении WPF, пользовательский интерфейс и уровень доступа к данным (DAL) выполняются в одном и том же процессе приложения. Пользовательский интерфейс "подключен" к DAL. Не то чтобы он всегда будет иметь открытое соединение с базой данных, но база данных всегда доступна. Объекты извлеченные из хранилища данных DAL могут быть обработаны в пользовательском интерфейсе, и те же объекты могут быть возвращены в DAL и сохранены в хранилище данных.
в Приложении N-уровня пользовательский интерфейс отделен, "отключен", от уровня доступа к данным сетевым подключением. Допустим, DAL является частью веб-службы. Веб-служба обычно не имеет состояния: она создает ответы и забывает о них. Кроме того, объекты будут сериализованы и десериализованы с обеих сторон соединения. Когда ответ входит в провод, объекты исчезают.
Entity Framework
как вы уже подозреваете, в мире EF "disconnected" относится к последнему значению, Приложению N-уровня.
в 1-уровневом приложении вы можете выбрать контекст (a DbContext
), который создает сущности и сохраняет те же сущности при любых изменениях в пользовательском интерфейсе. Нет необходимости повторно присоединять их к новому контексту. (Разумно ли поддерживать контекст, который долго-это другой вопрос).
в N-уровневых приложениях контекст либо создает сущности или сохраняет объекты, а не оба. Он создает сущности, которые сериализуются, и контекст удаляется. Сущности, возвращаемые из клиентского приложения, десериализуются и повторно присоединяются к новому экземпляру контекста, который сохраняет их изменения. Это источник вашего замешательства...
почему я должен явно присоединять сущности к контексту в disconnected модель
все это имеет смысл, если Вы читаете "отключено" в архитектурной коннотации. Лерман и Миллер описывают весь процесс в своей книге Программирование Entity Framework: DbContext Глава 4.работа с отключенными объектами, включая N-уровневые приложения.
а теперь ваш вопрос
когда использовать подключенную модель и когда использовать отключенную модель (используя EF)
can отвечайте так:
- из an ADO.Net точка зрения, нет выбора (сохраните некоторые особые случаи), EF работает отключено (как в: не оставляет соединение открытым).
- С архитектурной точки зрения нет выбора, когда приложение N-уровня: оно всегда отключено (как в: отсоединено и повторно присоединено, объекты не создаются и сохранено в том же контексте).
Только в 1-уровневых приложениях есть выбор. Этот выбор приводит нас к области управления жизненным циклом контекста. Об этом много говорилось. Неоспоримым фактом является то, что контекст становится медленным и потребляет память, когда он содержит "много" объектов. Очень трудно сохранить любое приложение, когда контексты имеют длительный срок службы, поэтому даже в приложениях 1-го уровня с тяжелыми данными следует серьезно рассмотреть отключенный (отсоединенный) сценарий.