0

我在数据库中有用户表,我创建了 Nhibernate 映射以从该表中获取数据。我创建了动态映射,它返回哈希表列表以响应不是用户类型,因为用户不存在物理类。我获取和保存数据的代码如下:

dynamic user = null;
using (ISession session = factory.OpenSession())
{
    user = session.CreateQuery("select u from User as u").List();

    user[0]["LastName"] = "s";
    session.Save(user[0]);
    session.Flush();
}

using (ISession otherSession = factory.OpenSession())
{
    user[0]["LastName"] = "ssss";
    otherSession.Save(user[0]);
    otherSession.Flush();
}

现在,在第一种情况下,当我获取数据并将其保存在同一个会话中时,它可以工作。但是在第二种情况下,当我在一个会话中获取数据然后在另一个会话中保存相同的对象时它不起作用。我收到错误:“没有持久性:System.Collections.Hashtable”。我现在这是一种奇怪的要求,但如果有人知道我可以实现它的任何方法,我将不胜感激。

我对 User 表的休眠映射如下:

<hibernate-mapping xmlns='urn:nhibernate-mapping-2.2' >
   <class entity-name='User' table='`User`'>
      <id name='UserId' column='`UserId`' type='string'>
        <generator class='identity'>
        </generator>
      </id>
      <property name='CreatedOn' column='`CreatedOn`'  type='DateTime' />
      <property name='FirstName' column='`FirstName`' type='string' />
      <property name='LastName' column='`LastName`' type='string' />
      <property name='LastUserNewResultAcknowledgedTime' column='`LastUserNewResultAcknowledgedTime`' type='string' />
      <property name='LoginName' column='`LoginName`' type='string' />
      <property name='LoginPassword' column='`LoginPassword`' type='string' />
      <property name='ModifiedBy' column='`ModifiedBy`' type='string'/>
      <property name='ModifiedOn' column='`ModifiedOn`' type='DateTime' />
   </class>
</hibernate-mapping>" 
4

1 回答 1

2

看来你做的一切都是正确的。映射似乎没问题(这已在第一个场景中得到证明)。所以你的动态模型没问题。在这里查看更多:

http://nhibernate.info/doc/nh/en/index.html#persistent-classes-dynamicmodels

可能缺少的是(您的代码段中未显示)显式切换到dynamic-map. 它可以在您的工厂配置中完成,也可以在您获得带有显式参数EntityMode.Map的会话时完成:

using (ISession otherSession = factory.OpenSession(EntityMode.Map))
{
 ...
}

因为如果会话期待 POCO(存在User类)并且提供了Hashtable(来自上一个会话,所以现在真正分离的对象),它无法找到它的持久性。

于 2012-11-08T11:40:35.883 回答