我有一个关于存储库使用的快速问题。但问最好的方法是显示一些伪代码,你们告诉我结果应该是什么
从ID为1的存储库中获取记录(假设它存在)
编辑一些属性
再次查询存储库,查找ID为1
结果= ??
我是否应该获取具有更新值的对象或没有(原始状态)的对象,请记住,因为更新属性值(步骤2),我没有告诉存储库更新此记录。
我想我应该得到原始项目的副本,而不是对编辑版本的引用。
请告诉我什么是正确的。
干杯
答案 0 :(得分:2)
存储库模式假设像对象的集合一样,所以理想情况下我认为它应该返回相同的对象实例,其中包含更新。
通常在某处有一个身份地图,因此您的存储库可以跟踪已经加载的内容。使用标识映射,当您获取具有相同Id的对象时,无论多少次,您都应始终获取已加载的对象。这就是所有更复杂的ORM的工作方式,通常也是一种很好的做法。身份映射有助于在您处于同一事务时保持同步,并为您节省一些数据访问权。
NHibernate的会话有一个它跟踪的身份映射,因此您不必担心尝试在您的存储库中实现自己的身份映射。另外我相信你可以使用NHibernate的无状态会话,如果你想加载另一个没有改变跟踪的实例,但我对此并不乐观。
答案 1 :(得分:0)
从你过去的问题来看,我假设你正在使用LINQ / C#?
如果您使用的是 DataContext
且尚未调用SubmitChanges()
,那么您应该取回原始未更改的对象。
刚试过它。我错了,你找回了改变的对象
如果您在ObjectTrackingEnabled = false
上设置DataContext
,则会获得未更改的对象。