代码之家  ›  专栏  ›  技术社区  ›  ulu

在ASP.NET中使用nhibernate更新实体

  •  0
  • ulu  · 技术社区  · 16 年前

    更新实体的建议方法是什么?到目前为止,我发现了两种方法:

    1. 只需使用现有ID和更新的属性值创建一个新实体,然后使用session.saveorupdate()。
    2. 使用DTO,使用session.load(dto.id)检索现有实体,从DTO分配新值,然后保存。

    no1需要的工作要少得多,但有时我会得到一个例外:“具有相同标识符值的不同对象已经与会话关联”。有没有一个简单的方法可以解决这个问题?

    我想2号可能需要额外去DB?

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

    谢谢 乌卢

    2 回复  |  直到 16 年前
        1
  •  2
  •   Shane Courtrille    16 年前

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

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

    在从域转换为DTO的过程中,我建议查看automaper。

        2
  •  1
  •   JoshBerke    16 年前

    要使用no1,您可以尝试将对象从nhibernates会话中逐出。这将消除关于已在会话中的对象的错误。

    我建议采用2号进近。尤其是如果你想增加任何一种视觉锁定。在许多情况下,对数据库的额外攻击不会那么昂贵。

    编辑

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