问题标签 [persistence-ignorance]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
149 浏览

c# - EF - 分离对象的持久性无知 - 最佳实践

现在我完全不明白持久性无知如何应用于实体框架。我使用实体框架设计了一个经典的存储库和工作单元。

现在,想象一个简单的客户端场景,我需要读取一些对象列表,然后保存其中一个。我的实体包含一些对象图,例如,Person 实体包含 Address 复杂属性,其中 Addrress 是另一个实体,也是一个 Hobby 对象列表,它也是另一个实体。我的客户:

正如你所看到的,我已经保持了持久性无知逻辑,我仅限于使用 person 对象及其边界,但是,在现实世界中,上面的代码片段将倾向于失败,因为我已经处理了分离对象工作单位。

所以,我考虑过使用一些实体包装器和一些方法,比如 ManageGraph(object obj, ObjectState state),以便在内部字典中保留所有更改的关系的任何其他更改。但是,我不喜欢这个解决方案,它看起来太脏了,看起来像 anty 模式:

但是……执着的无知在哪里?为什么我要强制使用坏技巧来获得正确的工作?持久性无知意味着我必须在没有任何其他东西的情况下处理简单对象,所以它会像下面这样:

当然,我知道,我不想要神奇的解决方案,它不存在,但是,是否有一些好的解决方案或建议可以获得最好的工作?

0 投票
1 回答
204 浏览

entity - 持久性无知如何处理对(非根)聚合的引用?

我们有几个聚合根,它们有两种主要的识别方式:

  • 一个整数“键”,在数据库中用作主键(通过引用聚合用作外键),在应用程序内部,公共 Web API无法访问。
  • 一个基于字符串的“id”,它也唯一地标识聚合根并且可以被公共 Web API 访问。

使用基于整数的私有标识符和基于字符串的公共标识符有几个原因 - 例如,数据库性能更好(8 字节整数而不是可变长度字符串)并且公共标识符难以猜测。

但是,类在内部使用基于整数的标识符相互引用,如果基于整数的标识符为 0,则表示对象尚未存储到数据库中。这会产生一个问题,因为实体在保存之前无法引用其他聚合根。

如何解决这个问题,或者我对持久性无知的理解存在缺陷?

编辑关于基于字符串的标识符

基于字符串的标识符由存储库生成,连接到 PostgreSQL 数据库,该数据库生成标识符以确保它不会与数据库中当前的任何内容发生冲突。例如:

我假设相同的概念可用于创建具有基于整数的非 0 键的实体,并且工作单元可以使用它在数据库中不存在的事实作为插入而不是更新的原因. 上面的test()函数将变为:

但是,鉴于上述情况,如果工作单元未按正确顺序保存数据库对象,则可能会发生错误。解决这个问题的方法是确保工作单元以正确的顺序保存实体吗?

我希望上面的编辑能澄清我的情况。