подключенная модель и отключенная модель в EF

Я смущен много о подключенной модели и отключен в entity framework .

я использовал традиционный ADO.net (DataReader для подключенной модели, а DataAdapter для отключения модели) и все, что я знаю, что я использую подключенную модель, когда у меня много пользователей, нужно обновить или вставить вместе, а отключенная модель в нескольких случаях, когда мне нужно отправить данные в другой процесс, сделать некоторые операции с данными в памяти и отправить их обратно в БД .

теперь Я прочитал несколько статей о подключенной модели и отключенной модели в EF, и я смущен, почему я должен явно присоединять сущности к контексту в отключенной модели ? Я также читал, что поведение по умолчанию в web-это отключенная модель, а в WPF-подключенная модель !


  • может ли кто-нибудь легко объяснить аналогию с реальной жизнью в чем разница между двумя моделями?
  • как мы смогли отрегулировать обе модели в эф с простым пример?
  • существует ли связь между типом приложения (веб-форма , MVC, WPF, WCF) и выделенная модель, используемая в EF?
  • когда использовать подключенную модель и когда использовать отключенную модель (используя EF) ?

2 ответов


Фон

ADO.NET рамки поддерживает две модели архитектуры доступа к данным:

  1. Подключение Ориентированный
  2. отключен

В Соединении Ориентированная Архитектура Доступа К Данным приложение подключается к источнику данных, а затем взаимодействует с ним через SQL-запросы использование того же соединения (например, необходимо поддерживать открытое соединение между вашим приложением и источником данных, даже если он не использует никаких операций с базой данных).

подключенная архитектура - это когда вы постоянно совершаете поездки в базу данных для любой операции CRUD (Create, Read, Update и Delete), которую вы хотите сделать. Это создает больше трафика в базу данных, но обычно намного быстрее, так как вы должны делать меньшие транзакции.

он построен на классы Connection, Command, DataReader и Transaction.

enter image description here

В Отключенной Архитектуре Доступа К Данным ADO.net использует хранилище данных в памяти, которое может содержать несколько таблиц одновременно (они извлекаются раньше).

Disconnected architecture-это метод извлечения набора записей из базы данных и его хранения, позволяющий выполнять множество операций CRUD (Create, Read, Update и Delete) над данными в памяти, тогда это может быть повторная синхронизация с базой данных при повторном подключении.

он построен на классы Connection, DataAdapter, CommandBuilder, DataSet и DataView.

enter image description here


некоторые ключевые классы подключенной и отключенной архитектуры

  • 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-го уровня с тяжелыми данными следует серьезно рассмотреть отключенный (отсоединенный) сценарий.