0

データベースに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();
}

さて、最初のケースでは、データをフェッチして同じセッションに保存すると、機能します。しかし、2番目のケースでは、あるセッションでデータをフェッチしてから、同じオブジェクトを別のセッションに保存すると、機能しません。「次のパーシスタがありません: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>" 
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 に答える