存储库模式

发布于 2024-09-12 23:49:25 字数 336 浏览 3 评论 0原文

我有一个关于存储库使用的快速问题。但最好的提问方法是显示一些伪代码,然后你们告诉我结果应该是什么

  • 从存储库中获取 ID 为 1 的记录(假设它存在)

  • 编辑几个属性

  • 再次查询存储库中 ID 为 1 的项目

  • Result = ??

我应该获取具有更新值的对象还是没有(原始状态)的对象,请记住,自从更新属性值(步骤 2)以来,我还没有告诉存储库更新此记录。

我认为我应该获得原始项目的副本,而不是对编辑版本的引用。

请告诉我什么是正确的。

干杯

I've got a quick question regarding the use of repositories. But the best way to ask is to show a bit of pseudocode and you guys tell me what the result should be

  • Get a record from the repository with ID of 1 (assume it exists)

  • Edit a couple of properties

  • Query the repository again for an item with ID of 1

  • Result = ??

Should I get the object with updated values or the object without (original state), bearing in mind that since updating the values of properties (step 2) I have not told the repository to update this record.

I think I should get a copy of the original item and not a reference to the edited version.

Please tell me what is correct.

Cheers

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一梦等七年七年为一梦 2024-09-19 23:49:25

存储库模式应该像对象的集合一样,所以理想情况下我认为它应该返回包含更新的相同对象实例。

通常,某个地方会有一个身份映射,以便您的存储库可以跟踪已加载的内容。使用身份映射,当您获取具有相同 ID 的对象时,无论多少次,您都应该始终取回已加载的对象。这就是所有更复杂的 ORM 的工作方式,并且通常是一个很好的实践。身份映射可帮助您在同一事务中保持同步,并节省一些数据访问权限。

NHibernate 的会话有一个它跟踪的身份映射,因此您不必担心尝试在存储库中实现您自己的会话。另外,我相信如果您想加载另一个实例而不进行更改跟踪,您可以使用 NHibernate 的无状态会话,但我对此并不乐观。

The repository pattern is suppose to act like a collection of your objects, so ideally I think it should return the same object instance which would have the updates in it.

Generally there is an identity map somewhere so your repositories can keep track of what has already been loaded. With an identity map, when you fetch an object with the same Id you should always get the already loaded object back regardless of how many times. This is how all more sophisticated ORMs work and is generally a good practice. An identity map helps keep things in sync while you are in the same transaction and saves you some data access.

NHibernate's session has an identity map it keeps track of so you don't have to worry about trying to implement your own in your repositories. Also I believe you can use NHibernate's stateless session if you want to load another instance without change tracking, but I'm not positive on that.

洒一地阳光 2024-09-19 23:49:25

从您过去的问题来看,我假设您正在使用 LINQ/C#?

如果您使用的是DataContext并且尚未调用SubmitChanges(),那么您应该返回原始未更改的对象。

刚刚测试过它。我错了,你找回改变的对象。
如果您在 DataContext 上设置 ObjectTrackingEnabled = false,您将获得未更改的对象。

Judging from your past questions I'm assuming you are using LINQ/C#?

If you are using a DataContext and you haven't called SubmitChanges() then you should get back the original unchanged object.

Just tested it. I was wrong, you get back the changed object.
If you set ObjectTrackingEnabled = false on the DataContext you will get the unchanged object.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文