Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一个实体应该是持久的无知吗?_C#_.net_Entity Framework - Fatal编程技术网

C# 一个实体应该是持久的无知吗?

C# 一个实体应该是持久的无知吗?,c#,.net,entity-framework,C#,.net,Entity Framework,一个实体应该是持久的无知吗?那么microsoft ADO.NET实体Framorwok呢?它是否持续无知?EF是否与存储系统无关?是。如果需要,您可以编写自己的提供者。例如,基于内存的存储模型。EF需要一个提供程序模型。 一般来说,实体对象应该是简单的数据持有者。他们不应该关心数据来自何处、如何获得或去向何方,他们的工作是作为一组相关数据点(如果您愿意的话,记录)的容器。通常还有其他对象(数据访问对象),其任务是获取数据并用数据填充实体对象,或者获取实体对象并将其数据保存到数据存储。实体框架既

一个实体应该是持久的无知吗?那么microsoft ADO.NET实体Framorwok呢?它是否持续无知?

EF是否与存储系统无关?是。如果需要,您可以编写自己的提供者。例如,基于内存的存储模型。EF需要一个提供程序模型。

一般来说,实体对象应该是简单的数据持有者。他们不应该关心数据来自何处、如何获得或去向何方,他们的工作是作为一组相关数据点(如果您愿意的话,记录)的容器。通常还有其他对象(数据访问对象),其任务是获取数据并用数据填充实体对象,或者获取实体对象并将其数据保存到数据存储。

实体框架既支持持久性无关实体,也支持持久性感知实体

以前的答案表明,对于您使用的生成模式,这在历史上是正确的(巧合),但现在不再如此,代码优先和数据库第一代模式都可以选择持久性感知(ish)或持久性无知

EF中支持或反对持久性忽略的决定是一个更改跟踪问题,我们如何检测实体发生的更改,并决定需要采取什么措施将这些更改持久化到数据库。EF有三种主要的变更跟踪方法

  • 快照跟踪(实体完全不知道持久性)
  • POCO代理更改跟踪(实体似乎不知道持久性,但幕后知道持久性)
  • 现已弃用的自跟踪实体(STE)(实体支持持久性)
持久性忽略就是允许我们描述实体的外观,而不显式地推断它们映射到数据库表。这意味着我们与特定数据库实现的联系不那么严格。然而,对于持久性的无知伴随着我们如何有效地与数据库通信的一些权衡

如果我们的实体完全不知道持久性,那么我们需要让我们的框架做更多的工作来理解它们何时改变以及改变对我们的数据库意味着什么。对于EntityFramework,这是通过存储上下文跟踪(看到)的所有实体的并排副本来实现的,并执行diff来检测更改

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

EF团队在快照更改跟踪器上做了非常出色的工作,使我们能够拥有完全不依赖持久性的实体。这在小范围内(我们一次跟踪不到1k个对象)表现非常好,但在可能不适合我们使用的情况下,他们提供了替代跟踪方法

即使使用纯POCO实体和快照跟踪,我们也有不同程度的持久性忽略,这取决于我们是否决定使用属性修饰或模型生成器来配置映射到SQL表的确切细节。这是我非常喜欢使用模型生成器而不是属性装饰的关键原因之一


在回答你题为“一个实体是否应该持续无知”的问题时,我的意见是理想的是肯定的,但只有在它实际上是有意义的情况下才这样做。

“应该”?取决于您使用的框架。EF使用POCO,这意味着它们一直是无知的。在发布之前,你有没有试过阅读一次文档?他们在实体框架文档中非常清楚这一点,是的,这就是我提出这个问题的原因。我对这里的答案比对文档更感兴趣:人们所谓的“持续无知”到底是什么意思。他们不知道它们是如何储存的,但他们不知道它们可以被储存吗?