如何在nhibernate中保存动态对象

时间:2012-11-08 08:07:20

标签: nhibernate dynamic nhibernate-mapping

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

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表的nhibernate映射如下:

<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>" 

1 个答案:

答案 0 :(得分:1)

看来你正在做的一切都正确。映射似乎没问题(并且在第一个场景中已经开始了)。所以你的动态模型就可以了。在这里看到更多:

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(来自上一个会话,所以现在真的是分离的对象),它找不到持久性为了它。