2010-08-07 130 views
2

我对使用存储库有一个简短的问题。但要问最好的办法是表现出位的伪码和你们告诉我什么结果应该存储库模式

  • 从储备库中获得创纪录的ID为1(假设它存在)

  • 编辑几个属性

  • 查询与1个

  • 结果的ID的项目再次存储库=占地

我应该得到使用更新的值对象或无(原始状态)的对象,铭记,因为更新的属性(步骤2)的值我还没有告诉库更新此记录。

我想我应该得到一个原始项目的副本,而不是对编辑版本的引用。

请告诉我什么是正确的。

干杯

回答

0

从你我假设你过去的问题来看使用LINQ/C#?

如果您使用的是DataContext并且您还没有调用SubmitChanges()那么您应该找回原始未更改的对象。

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

+0

嘿,好猜。我首先使用Entity Framework代码,但是在设计TestDataContext(将实体存储在内存中)时,它实际上让我思考了所需的行为。 – nick 2010-08-07 17:29:40

2

存储库模式假设像您的对象的集合,所以理想情况下,我认为它应该返回相同的对象实例,它会有更新。

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

NHibernate的会话有一个它跟踪的身份映射,所以你不必担心试图在你的仓库中实现自己的身份。此外,我相信你可以使用NHibernate的无状态会话,如果你想加载另一个实例没有更改跟踪,但我不积极。

+0

有道理,但最初对我们这些习惯于以旧时尚方式做事的人来说很直观。我想不小心使用一个静态的DataContext是一个很好的方式来结束你的应用程序中的一些疯狂的数据。 – jwsample 2010-08-07 18:43:59

+0

如上所述,它是为您照顾的身份地图。如果您完全使用单独的DbContext实例,则除非先保存更改并从另一个请求对象,否则不会看到该行为。它的设计是这样的。 – ssmith 2016-02-10 03:05:58