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

使用ObjectDataSource在Gridview更新期间修改子对象

  •  0
  • Kendrick  · 技术社区  · 14 年前

    我在模型层使用NHibernate,我有一个HTTP模块,负责在每个请求开始时实例化会话,并在每个请求结束时清理会话(即每个请求的会话)。在本例中,我有两种对象类型:

    -具有一组属性和一组子项的对象。
    子项 -属性包括DateTime(EffectiveDate)和指向完全不同数据库的未强制FK的对象。ChildItem类也包含对父级的引用(多对一)

    虽然ParentItem在其集合中有多个ChildItems,但我通常只对集合中最新的ChildItem感兴趣。

    欲望:

    问题: 我似乎无法从OnItemUpdate处理程序中的GridView/ListView访问基础数据项(这并不意外,因为数据现在处于viewstate)。我想我可以使用databound控件中的ID从会话中加载ParentItem,创建一个新的ChildItem,将其添加到ParentItem,然后保存ParentItem。由于NHibernate缓存数据,加载应该给我一个来自缓存的副本(没有到DB的往返),我要么在ParentItem被保存回来之前这样做(因此没有提交到ParentItem的更改,只是提交到ChildItem),要么在之后这样做(因此缓存的版本仍然是相同的,我的新对象将匹配更新的版本)。执行此操作时得到的结果(对于ParentItemID=1):

    a different object with the same identifier value was already associated 
    with the session: 1, of entity: NameSpace.ParentItem
    

    在线:

    Session.SaveOrUpdate(parentItemInstance);
    

    我猜这与我的ObjectDataSource已经加载了这个ParentItem来更新它有关,但我不知道从这里开始该怎么做。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Community    7 年前

    您的问题可能与会话有关。您是否正在为每个请求创建和关闭NHibernate会话?

    你应该使用会话。合并将另一个会话中的对象保存到当前会话中。你找到一篇关于session.saveor更新以及会话。合并在这里: NHibernate - Difference between session.Merge and session.SaveOrUpdate?