Подключенной модели и отключенной модели в EF

Я немного запутался в подключенной модели и отключен в инфраструктуре сущности.

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

Теперь я прочитал несколько статей о подключенной модели и отключенной модели в EF, и я смущен, почему я должен явно привязывать объекты к контексту в отключенной модели? Я также прочитал, что поведение по умолчанию в сети отключено, а в WPF подключена модель!


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

Ответы

Ответ 1

Фон

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

  • Ориентированный на подключение
  • Отключено

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

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

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

введите описание изображения здесь

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

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

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

введите описание изображения здесь


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

  • DataReader - это связанная архитектура, поскольку она поддерживает соединение открыто до тех пор, пока все строки не будут выбраны один за другим.
  • DataSet - отключенная архитектура, поскольку все записи и сразу нет необходимости поддерживать связь.
  • DataAdapter действует как мост между соединенными и Отключенные объекты. Он управляет соединениями между источником данных и DataSet, заполнив данные из источника данных на DataSet.

, который лучше в желаемой ситуации?

Подключенный режим

  • соединение ориентировано
  • мы читаем данные из базы данных с помощью объекта DataReader
  • Его методы обеспечивают более высокую производительность
  • Он может хранить данные отдельной таблицы
  • Только для чтения, мы не можем обновлять данные

Отключенный режим

  • Отключено ориентированное соединение.
  • мы читаем данные из базы данных с помощью объекта DataSet.
  • Низкая скорость и производительность.
  • Он может содержать несколько таблиц данных.
  • мы можем выполнить все параметры как обновления, вставки, удаления и т.д.

Ответ на ваши вопросы

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

Веб-приложение может быть подключено или отключено, а на самом деле приложения ASP.NET отключены, из-за отсоединенной модели ADO.NET. Отключенная модель становится все более популярной благодаря простой реализации и упрощению поиска и устранения неисправностей. Хороший дизайн с приложением ASP.NET закроет все соединения с базой данных, как только обработка данных будет завершена, независимо от того, будет ли она 15 ударов в месяц или 15 ударов в секунду.

Может ли кто-нибудь объяснить в простой манере с аналогией реальной жизни какая разница между двумя моделями?

Да, предположим, что у вас есть несколько важных советов, чтобы рассказать/узнать друга. Отключено означает, что вы ждали его, или вы тратите время, чтобы получить больше советов. Подключенный - это способ, когда вы живете с ним или имеете он-лайн/RealTime сообщение для него, чтобы каждый раз сообщать каждый совет.

Как мы могли бы обрабатывать обе модели в EF с помощью простого примера?

EF использует модель Disconnected. поскольку вы работаете с данными и делаете необходимые изменения, а затем выполняете SaveChanges:)

Есть ли связь между типом приложения (веб-форма, MVC, WPF, WCF) и выделенной модели, используемой в EF?

Он основан на логике приложения. Приложения RealTime необходимо подключать, поскольку они нуждаются в распространении и обновлении во времени, а не в других типах приложений.

Когда использовать подключенную модель и когда использовать отключенную модель (используя EF)?

Я ответил на это. Просто хочу сказать, что, поддерживая соединения открытыми только на минимальный период времени, ADO.NET сохраняет системные ресурсы и обеспечивает максимальную безопасность для баз данных, а также оказывает меньшее влияние на производительность системы. Он основан на вашей стратегии/типе приложения, вы можете принять правильное решение самостоятельно.

Обновление

но если бы я был в отключенной модели, не могли бы вы рассказать мне, как EF может обрабатывать несколько операций (INSERT, UPDATE, DELETE) от многих пользователей в то же время?

Взгляните на ObjectStateManager, который отвечает за все, связанное с отслеживанием объектов в контексте. Если некоторые пользователи выполняют параллельные обновления для одной и той же записи, по умолчанию Entity Framework реализует оптимистичную модель concurrency. Это означает, что блокировки не хранятся на данных в источнике данных между тем, когда данные запрашиваются и данные обновляются. Entity Framework сохраняет изменения объектов в базе данных без проверки на concurrency. Для объектов, которые могут испытывать высокую степень concurrency (например, банковскую систему), мы рекомендуем, чтобы объект определял свойство в концептуальный слой с атрибутом ConcurrencyMode="fixed", как показано в следующем примере:

<Property Name="Status" Type="Byte" Nullable="false" ConcurrencyMode="Fixed" />

Когда этот атрибут используется, Entity Framework проверяет изменения в базе данных перед сохранением изменений в базе данных. Любые конфликтующие изменения вызовут OptimisticConcurrencyException, который также может возникнуть, когда вы определяете модель данных сущности, которая использует хранимые процедуры для обновления данных источник. В этом случае исключение возникает, когда хранимая процедура, используемая для выполнения отчетов об обновлениях, обновляет нулевые строки. Для получения дополнительной информации посетите Сохранение изменений и управление Concurrency

Ответ 2

ADO.Net

"Подключено" и "отключено" в ADO.Net о подключении к базе данных. A DataReader всегда имеет открытое соединение, дуэт DataSet/DataAdapter при необходимости подключается к базе данных.

Я думаю, что обычная реальная аналогия делает телефонный звонок. Если вы хотите, чтобы друг поговорил с вами по дороге домой, пока вы едете, вы предпочтете "подключенный режим": во время телефонного разговора вы говорите туда и обратно, пока не будете там. Было бы слишком трудоемким, чтобы начать новый телефонный звонок для каждой инструкции.
Но если вы спросите свою мать, которая живет в двух кварталах от вас, чтобы проверить, закрыли ли вы свое кухонное окно, вы позвоните ей, и она пойдет проверить и перезвонит вам: "отключен". Тем временем вы будете продолжать делать то, что делаете.

В этом смысле Entity Framework всегда работает в отключенном режиме. Каждая операция базы данных с помощью EF открывает и закрывает соединение с базой данных (если вы явно не переопределите это поведение).

Архитектура программного обеспечения

Но в архитектуре программного обеспечения "подключенные" и "отключенные" обычно относятся к 1-ярусу против N-уровня. В одноуровневом приложении, например приложении WPF, пользовательский интерфейс и уровень доступа к данным (DAL) выполняются в одном и том же процессе приложения. Пользовательский интерфейс "подключен" к DAL. Не то, чтобы он всегда имел открытое соединение с базой данных, но база данных всегда доступна. Объекты, извлеченные из хранилища данных с помощью DAL, могут обрабатываться в пользовательском интерфейсе, и те же объекты могут быть возвращены в DAL и сохраняться в хранилище данных.

В приложении N-уровня пользовательский интерфейс разделяется, "отключается", от уровня доступа к данным посредством сетевого соединения. Пусть говорят, что DAL является частью веб-службы. Веб-служба, как правило, не имеет апатридов: она производит ответы и забывает о них. Кроме того, объекты будут сериализованы и десериализованы с обеих сторон соединения. Когда ответ попадает на провод, объекты исчезают.

Entity Framework

Как вы уже подозреваете, в мире EF "отключено" относится к последнему значению, к N-уровню.

В одноуровневом приложении вы можете выбрать контекст (a DbContext), который создает объекты и сохраняет те же объекты, если в пользовательском интерфейсе будут сделаны какие-либо изменения. Не нужно повторно присоединять их к новому контексту. (Является ли разумным поддерживать контекст живой, что долго является другим вопросом).

В приложениях N-уровня контекст либо создает сущности, либо сохраняет объекты, а не обе. Он создает объекты, которые становятся сериализованными и контекст расположен. Объекты, возвращающиеся из клиентского приложения, десериализуются и повторно присоединяются к новому экземпляру контекста, который сохраняет их изменения. Это источник вашей путаницы...

почему я должен явно привязывать сущности к контексту в отключенной модели

Все имеет смысл, если вы читаете "отключен" в архитектурной коннотации. Лерман и Миллер описывают весь процесс в своей книге Programming Entity Framework: DbContext глава 4: Работа с отключенными объектами, включая приложения N-уровня.

И теперь ваш вопрос

Когда использовать подключенную модель и когда использовать отключенную модель (с использованием EF)

можно ответить следующим образом:

  • С точки зрения ADO.Net выбора нет (за исключением некоторых особых случаев), EF работает отключен (как в: не закрывает соединение).
  • С архитектурной точки зрения нет выбора, когда приложение является N-уровневым: оно всегда отключается (как в: отсоединенном и повторно подключен, объекты не создаются и не сохраняются в том же контексте). Только в одноуровневых приложениях есть выбор. Этот выбор приводит нас к области управления жизненным циклом контекста. Об этом было сказано много. Неоспоримым фактом является то, что контекст становится медленным и потребляющим память, когда он содержит множество объектов. Очень сложно поддерживать какое-либо приложение мгновенно, когда контексты имеют длительные сроки жизни, поэтому даже в тяжелых приложениях с 1-го уровня необходимо серьезно рассмотреть отключенный (отсоединенный) сценарий.