一个实体应该持久无知吗?

时间:2012-12-21 14:18:15

标签: c# .net entity-framework

一个实体应该是Persitent无知吗?微软ADO.NET实体Framorwok怎么样?它一直无知吗?

3 个答案:

答案 0 :(得分:3)

实体框架支持持久性无知和持久性感知实体。

以前的答案表明,这是使用您使用的生成模式,这在历史上是真实的(巧合)但不再是这种情况,代码优先和数据库第一代模式可以选择持久性感知(ish)或持久性愚昧。

支持或反对EF中持久性无知的决定是一个变更跟踪问题,我们如何检测实体发生的变化,并决定将这些变更持久化到数据库所需的操作。 EF有三种主要的变更跟踪方法

  • 快照跟踪(实体完全持久性无知
  • POCO代理更改跟踪(实体似乎是持久性无知但幕后有持久性感知)
  • 现已弃用的自跟踪实体(STE)(实体持久性识别

持久性无知就是让我们描述我们的实体在没有明确推断它们映射到数据库表的情况下的外观。这意味着我们与特定数据库实现的联系不那么严格。然而,持久性无知伴随着我们如何有效地与数据库通信的一些权衡。

如果我们的实体完全没有持久性,我们需要让我们的框架做更多的工作来了解它们何时发生变化以及哪些变化对我们的数据库意味着什么。使用Entity框架,可以通过存储上下文跟踪(看到)的所有实体的并排副本,并执行diff来检测更改。

使用POCO代理,我们创建原始实体的模拟扩展,并监听特定属性的操作,以便我们可以更有效地跟踪更改。

EF团队在快照更改跟踪器上做了相当出色的工作,让我们拥有完全持久的无知实体。这在小环境中表现得非常好(我们一次跟踪的对象不到1k)但是如果这可能不适合我们的使用,他们提供了备用跟踪方法。

即使使用纯POCO实体和快照跟踪,我们也会有不同级别的持久性忽略,具体取决于我们是否决定使用属性修饰或模型构建器来配置映射到SQL表的确切详细信息。这是我非常喜欢使用模型构建器而不是属性修饰的主要原因之一。

回答你的标题问题'一个实体应该是一个无知的人吗?'我的意见理想是肯定的,但只是在它实际上有意义的地方。

答案 1 :(得分:0)

EF是存储系统不可知的。如果需要,您可以编写自己的提供者。例如基于存储器的存储模型。 EF期望有一个提供者模型 http://msdn.microsoft.com/en-us/library/ee789835.aspx

答案 2 :(得分:0)

一般来说,您的实体对象应该是简单的数据持有者。他们不应该关心数据的来源,获取方式或去向,他们的工作是作为相关数据点集合的容器(如果你愿意,可以记录)。通常有其他对象(数据访问对象),它们的工作是获取数据并用它填充实体对象,或者获取实体对象并将其数据保存到数据存储中。