Как сохранить динамический объект в 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
(исходя из предыдущего сеанса, поэтому теперь действительно отсоединенный объект), он не может найти персистентность для него.