我们正在使用DTO图案从服务层我们的域对象编组到我们的库,然后向下通过NHibernate的数据库中。

我碰到的一个问题,其中我拉DTO出储存库(例如CustomerDTO),然后将其转换成在我的服务层域对象(客户)。然后我尝试并保存新对象返回(例如SalesOrder),其中包含相同的客户对象。这反过来转化为SalesOrderDTO(和CustomerDTO)推到所述存储库中。

NHibernate的不喜欢这 - 它抱怨说,CustomerDTO是一个重复的记录。我假设,这是因为它在同一个会话,并且因为返回已被转化来回它不能识别为同一个对象拉出第一CustomerDTO。

我是卡在这里还是有办法解决?

由于

詹姆斯

有帮助吗?

解决方案

可以一个目的是通过使用锁重新附加到NHibernate的会话 - e.g

_session.Lock(myDetachedObject, NHibernate.LockMode.None);

这可能会或可能不会取决于正是这里发生的一切帮助。在一个侧面说明,使用DTO的与NHibernate不是最常见的做法,但事实上,NHibernate的(大部分)支持持久性无知意味着通常DTO的不作为广泛用作与其它一些ORM框架。

其他提示

这是真正关心如何NHibernate的会话工作。所以,如果你在会话中拉你CustomerDTO的一个实例,然后过了一段时间,你应该得到相同的CustomerDTO(比如通过主键) - 你实际上会得到参照相同的对象就像你在你的第一次检索确实

所以,你要做的就是,你要么通过调用session.Merge合并的对象或者你问你的会话对象通过调用session.Get(PrimaryKey的)做你的更新和刷新会话。

不过由史蒂夫的建议 - 这通常不是你做了什么 - 你真的想从数据库中获取你的域对象,并使用的DTO(如果neede)将数据传输到用户界面,Web服务什么...

正如其他人指出,实施的Equals和GetHashCode是朝着正确方向迈出的一步。还应考虑NHibernate的支持,为“附加” OR / M成语。

您还可以在您的处置nosetter.camelcase选项:的 http://davybrion.com/blog/2009/03/entities-required-properties-and-properties-that-shouldnt-be-modified/

此外,我想鼓励大家不要因缺乏信息在那里在线劝阻。这并不意味着你疯了,还是做错事。它只是意味着你在一个边缘的情况下工作。不幸的是像NHibernate的库最大的消费者是在内部和/或网络应用程序,其中存在的自由,瘦所有的持久性需要针对单个数据库短小。在现实中,有很多例外情况。

例如,我目前工作的一个商用桌面应用程序,其中有一个SQL CE数据库和图像文件之间传播我的域对象之一它的数据在磁盘上。不幸的是NHibernate的只能帮助我的SQL CE持久性。我被迫使用一种“双映射”(见的 Martin Fowler的“的模式企业应用架构模式“)通过知道什么数据去NHibernate和什么磁盘存储库层地图我的域模型。

它发生。这是一个真正的需要。有时,明显缺乏在工具表明你正在做一个不错的办法。但有时事实是,你刚才真的是在边缘的情况下,并需要建立一些这些模式为自己完成它。

  

我假设,这是因为它   拉出第一CustomerDTO在   同样的会议,并因为   返回已转换回来,   提出它不能认识到这一点的   相同的对象。

您是对的。 Hibernate无法。考虑实现equals和hashCode来解决这个问题。我想如果你没装这个会话中的对象进行重新连接可能只工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top