Как сохранить динамический объект в nhibernate

У меня есть таблица User в базе данных, и я создал отображение 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 для таблицы 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>" 

1 ответ

Кажется, вы все делаете правильно. Картография, кажется, в порядке (и это было доказано в первом сценарии). Итак, ваша динамическая модель в порядке. увидеть больше здесь:

http://nhibernate.info/doc/nh/en/index.html

Что может отсутствовать (это не показано в вашем фрагменте) - это явное переключение на dynamic-map, Это может быть сделано в конфигурации вашей фабрики или когда вы получаете сеанс с явным параметром EntityMode.Map:

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

Потому что, если сессия ожидает POCO (что есть User класс существует) и предоставляется Hashtable (исходя из предыдущего сеанса, поэтому теперь действительно отсоединенный объект), он не может найти персистентность для него.

Другие вопросы по тегам