我对连接模型很困惑,并且在 Entity Framework 中断开连接。
我使用的是传统的 ADO.net(DataReader
用于连接模型,DataAdapter
用于断开连接模型)
我所知道的是,当我有很多用户需要更新或插入时,我使用连接模型,而在少数情况下,当我需要将数据发送到其他进程时,我使用断开连接的模型对内存中的数据进行一些操作并将它们发回到数据库。
现在我阅读了一些关于 EF 中连接模型和断开连接模型的文章,我很困惑为什么我应该将实体显式附加到断开连接模型中的上下文?
我还读过 web 中的默认行为是断开连接的模型,而 WPF 中的默认行为是连接模型!
这两种型号有什么区别?
、MVC、WPF、WCF) 和 EF 中使用的专用模型?
最佳答案
背景
The ADO.NET Framework支持两种数据访问架构模型:
在面向连接的数据访问架构中 应用程序与数据源建立连接,然后使用相同的连接通过 SQL 请求与其交互(例如,即使不使用任何数据库操作,也必须在您的应用程序和数据源之间保持开放连接)。
连接架构是指您不断访问数据库以执行您希望执行的任何 CRUD(创建、读取、更新和删除)操作。这会为数据库创建更多流量,但通常会更快,因为您应该执行较小的事务。
它基于类
Connection
, Command
, DataReader
和 Transaction
.在断开连接的数据访问架构中 ADO.net 使用可以同时保存多个表的内存数据存储(它们之前被提取过)。
断开连接的架构是一种从数据库中检索记录集并将其存储的方法,使您能够对内存中的数据执行许多 CRUD(创建、读取、更新和删除)操作,然后它可以与数据库重新同步重新连接时。
它建立在类上
Connection
, DataAdapter
, CommandBuilder
, DataSet
和 DataView
.连接和断开连接架构的一些关键类别
DataReader
是连接架构,因为它保持连接打开,直到所有行都被一一获取。
DataSet
是断开的架构,因为所有的记录都是立即带来,无需保持连接。
DataAdapter
充当连接和连接之间的桥梁断开连接的对象。它管理数据源和
Dataset
通过将数据源中的数据填充到 Dataset
. 在理想的情况下哪个更好?
连接模式
DataReader
从数据库中读取数据对象 断开模式
DataSet
从数据库中读取数据目的。 回答您的问题
Now I read some articles about connected model and disconnected model in EF and I'm confused why should I attach explicitly the entities to the context in disconnected model? I had read also that the default behavior in web is disconnected model and in WPF is connected model !
Web 应用程序可以连接或断开连接,以及,实际上 ASP.NET 应用程序断开连接 , 由于 ADO.NET 断开模型。由于简单的实现和更容易的故障排除,断开连接的模型变得越来越流行。 ASP.NET 应用程序的良好设计会在数据操作完成后立即关闭所有数据库连接,无论是每月 15 次点击还是每秒 15 次点击。
Could someone explain in easy manner with an an analogy of real life what's the difference between the two models?
是的,假设您有一些重要的提示可以告诉/了解 friend 。 断开连接 意味着你一直在等待见到他的方式,或者你正在花时间获得更多要说的提示。 已连接 是您与他住在一起或与他进行在线/实时通信以在每次需要时告知每个提示时的方式。
How we could handle both models in EF with simple example?
EF 使用 断开连接 模型。因为您处理数据并进行所需的更改,然后您执行
SaveChanges
:)Is there a relationship between the type of app (web form , MVC, WPF, WCF) and the dedicated model used in the EF?
它基于应用程序逻辑。 RealTime 应用程序需要连接,因为它们需要按时传播和更新,而不是其他应用程序类型。
When to use connected model and when to use disconnected model (using EF) ?
我已经回答了这个。只是我想说的是,ADO.NET 仅在最短的时间内保持连接打开,从而节省了系统资源并为数据库提供了最大的安全性,同时对系统性能的影响也较小。它基于您的应用程序策略/类型,您可以自己做出正确的决定。
更新 :
but if i was in a disconnected model, Could you tell me how the EF can handle multiple operations (INSERTs,UPDATEs,DELETEs) from many users at the same time?
看看
ObjectStateManager
它负责上下文中与对象跟踪相关的一切。如果某些用户对同一条目执行并发更新,默认情况下, Entity Framework 实现了乐观并发模型。这意味着在查询数据和更新数据之间不会对数据源中的数据持有锁。 Entity Framework 将对象更改保存到数据库中,而无需检查并发性。 对于可能会遇到高度并发的实体(如银行系统),我们建议该实体在概念层定义一个属性为 ConcurrencyMode="fixed"
的属性。 ,如下例所示:<Property Name="Status" Type="Byte" Nullable="false" ConcurrencyMode="Fixed" />
使用此属性时, Entity Framework 会在将更改保存到数据库之前检查数据库中的更改。任何冲突的更改都将导致
OptimisticConcurrencyException
当您定义使用存储过程更新数据源的实体数据模型时,也会发生这种情况。在这种情况下,当用于执行更新的存储过程报告更新了零行时,将引发异常。更多信息请访问 Saving Changes and Managing Concurrency
关于asp.net - EF中的连接模型和断开模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31763745/