背景
ADO.NET Framework支持两种数据访问架构模型:
- 连接导向
- 断开式
在连接导向的数据访问架构中,应用程序与数据源建立连接,并通过 SQL 请求与其进行交互,使用相同的连接(例如,即使不使用任何数据库操作,也必须维护应用程序和数据源之间的打开连接)。
连接式架构是指您不断地对数据库进行任何CRUD(创建、读取、更新和删除)操作。这会增加到数据库的流量,但通常更快,因为您应该执行较小的事务。
它是基于类 Connection
, Command
, DataReader
和 Transaction
构建的。
![enter image description here](https://istack.dev59.com/oW6uf.webp)
在断开式数据访问架构中,ADO.net使用内存数据存储器,可以同时保存多个表格(它们在先前被提取)。
断开式架构是一种从数据库检索记录集并将其存储的方法,使您能够在内存中执行许多CRUD(创建、读取、更新和删除)操作,然后在重新连接时可以重新与数据库同步。
它建立在类Connection、DataAdapter、CommandBuilder、DataSet和DataView之上。
![enter image description here](https://istack.dev59.com/xGeVc.webp)
连接和断开架构的一些关键类
DataReader
是连接架构,因为它保持连接打开直到逐行获取所有行。
DataSet
是断开架构,因为所有记录都一次性带出,不需要保持连接活动。
DataAdapter
充当连接和断开对象之间的桥梁。它通过将数据从数据源填充到Dataset
来管理数据源和Dataset
之间的连接。
在所需情况下哪个更好?
连接模式
- 面向连接
- 我们使用
DataReader
对象从数据库中读取数据
- 其方法提供更快的性能
- 它可以保存单个表的数据
- 它是只读的,我们不能更新数据
断开模式
- 它是断开连接的面向连接。
- 我们使用
DataSet
对象从数据库中读取数据。
- 速度和性能都较低。
- 它可以容纳多个数据表。
- 我们可以执行所有选项,如更新、插入、删除等操作。
你的问题的答案
我现在读了一些关于EF中连接模型和断开模型的文章,我很困惑为什么在断开模型中需要显式地将实体附加到上下文中?我也读到过在Web中默认行为是断开模型,在WPF中是连接模型!
Web应用程序可以是连接或断开的,事实上,由于ADO.NET断开模型,ASP.NET应用程序实际上是断开的。由于其简单的实现和更容易的故障排除,断开模型越来越受欢迎。在ASP.NET应用程序中,良好的设计应该在数据操作完成后立即关闭所有数据库连接,无论每月有15次点击还是每秒钟有15次点击。
有人能用生活的类比以简单的方式解释两种模型之间的区别吗?
可以的,假设你有一些重要的提示要告诉/让朋友意识到。 断开模型表示你等待看到他或花时间获取更多提示以便说出来。 连接模型是当你与他一起生活或在线/实时与他进行通信,每次想要告诉他每个提示的方式。
我希望您能用简单的例子来处理EF中的两个模型?
EF使用“断开连接”的模型。因为您使用数据并进行所需的更改,然后执行SaveChanges:)
应用程序类型(Web表单、MVC、WPF、WCF)和EF中使用的专用模型之间是否存在关系?
这基于应用程序逻辑。实时应用程序需要连接,因为它们需要实时传播和更新,而不是其他应用程序类型。
何时使用连接模型,何时使用断开连接模型(使用EF)?
我已回答过这个问题。只是想说,通过仅在最短时间内保持连接,ADO.NET可以节省系统资源,并为数据库提供最大安全性,并且对系统性能的影响较小。它基于您的应用程序策略/类型,您可以自己做出好的决定。
如果我处于断开连接的模式下,您能告诉我EF如何同时处理多个用户的多个操作(插入,更新,删除)吗?
请看
ObjectStateManager
,它负责上下文中与对象跟踪相关的一切。如果一些用户对同一条目执行并发更新,默认情况下,Entity Framework 实现了乐观并发模型。这意味着在从数据源查询数据到更新数据之间,不会锁定数据源中的数据。
Entity Framework 会保存对象更改到数据库而不检查并发。 对于可能经历高度并发的实体(如银行系统),我们建议实体在概念层中定义一个带有
ConcurrencyMode="fixed"
属性的属性,如以下示例所示:
<Property Name="Status" Type="Byte" Nullable="false" ConcurrencyMode="Fixed" />
当使用此属性时,实体框架在将更改保存到数据库之前会检查数据库中的更改。任何冲突的更改都会导致
OptimisticConcurrencyException
,这也可能发生在定义使用存储过程更新数据源的实体数据模型时。在这种情况下,当用于执行更新的存储过程报告未更新任何行时,将引发异常。有关更多信息,请访问
保存更改和管理并发性。