如何在nhibernate中保存动态对象

如何在nhibernate中保存动态对象,nhibernate,dynamic,nhibernate-mapping,Nhibernate,Dynamic,Nhibernate Mapping,我在数据库中有一个用户表,我创建了Nhibernate映射,用于从该表中获取数据。我创建了动态映射,它返回哈希表列表作为响应,而不是用户类型,因为用户不存在物理类。我获取和保存数据的代码如下: dynamic user = null; using (ISession session = factory.OpenSession()) { user = session.CreateQuery("select u from User as u").List(); user[0]["L

我在数据库中有一个用户表,我创建了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”。我现在知道这是一种奇怪的要求,但如果有人知道我可以实现它的任何方式,我会心存感激

我的用户表的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>" 

" 

看起来您做的每件事都是正确的。映射似乎是正确的(在第一个场景中就是这样)。所以您的动态模型是正确的。请参阅此处的更多信息:

可能缺少的(代码段中未显示)是显式切换到
动态映射
。这可以在工厂配置中完成,也可以在使用显式参数EntityMode.map进行会话时完成:

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

因为如果会话期望POCO(存在
用户
类),并且提供了
哈希表
(来自上一个会话,因此现在真正分离了对象),它找不到它的持久化程序。

因为这是一个常规类映射,所以您似乎没有使用dynamic。您报告的错误可能是因为在hbm文件中放弃了将“Embedded Resource”作为标志。@FelicePollano,我想说这确实是dnymic模型映射。虽然它似乎与类相同(在.hbm.xml文件中)它将被转换成字典,而不是
User
类(请参阅我的答案以获取链接)