在Asp.Net中使用NHibernate更新实体

时间:2009-06-17 12:21:21

标签: asp.net nhibernate

更新实体的推荐方法是什么?到目前为止,我想出了两种方法:

  1. 只需使用现有的Id和更新的属性值创建一个新实体,然后使用session.SaveOrUpdate()
  2. 使用DTO,使用session.Load(dto.Id)检索现有实体,从dto分配新的vau,然后保存。
  3. No1需要更少的努力,但有时候我得到一个例外:“具有相同标识符值的不同对象已经与会话相关联”。有一个简单的方法吗?

    No2可能需要额外的DB之旅吗?

    很抱歉,如果已经回答了,那就找不到答案了。

    由于 乌鲁

2 个答案:

答案 0 :(得分:2)

您对DTO的第二个选择是我的首选方式。您的DTO应该特定于屏幕(Google Screen Bound DTO),以便屏幕和您的域可以彼此独立地更改。

它也不会为数据库添加额外的行程,因为#1需要一个断开的实体,事实之后必须重新连接(触发选择)。担心一个额外的选择也强烈过早优化。

在从域转换为DTO方面,我建议您查看AutoMapper。

答案 1 :(得分:1)

要使用No1,您可以尝试从nHibernates会话中逐出该对象。这将消除有关会话中已存在的对象的错误。

我建议使用方法编号2.特别是如果你想添加任何种类的光学锁定。在许多情况下,对数据库的一次额外打击也不会那么昂贵。

修改

要检查会话中是否已存在实体,您可以在Session实例上使用Contains(obj)方法。