Я немного озадачен методом NHibernate IsDirty().
Непосредственно после получения (очень большого) сложного объекта из моей базы данных ISession.IsDirty() NHibernate дает «истину».
IFacadeDAL fd = new FacadeDAL();
// Session's not dirty
IProject proj = fd.GetByID<IProject, string>("123611-3640");
// Session is dirty
Однако, если я вызову Commit() следующим образом:
using (ITransaction trans = Facade.Session.Transaction)
{
trans.Begin();
Facade.Session.Save(entity);
trans.Commit();
return true;
}
это приводит к отсутствию sql (за исключением «exec sp_reset_connection»).
Я читал, что из-за «выбора сопоставления» вы можете получить «призраков» в своем сеансе (заставляя сеанс говорить, что он грязный), но не будет ли он также пытаться что-то обновить? Кроме того, если это вызвано, например. "преобразовав" бит sql в логическое значение С#, я не думаю, что смогу его изменить... (но не знаю, может ли это быть причиной призраков).
Обновление 2: здесь задействовано несколько представлений (sql server) и таблиц. Это (очень) упрощенный класс:
public class Project : IProject
{
private string id;
private List<IPlantItem> plantItems;
public Project() { }
public virtual string ID
{
get { return id; }
}
public virtual IEnumerable<IPlantItem> PlantItems
{
get { return plantItems; }
}
}
'PlantItem сохраняется в таблице. Поэтому я ожидаю, что когда я что-то изменю в PlantItem, IsDirty должен измениться на «true».
Мой вопрос: есть ли способ проверить, будет ли сессия в этот момент на flush() (или, в моем случае, на commit()) генерировать фактические операторы sql? И если нет: есть ли другой способ (вручную) сохранить какой-то снимок сеанса для сравнения с текущим сеансом?
Обновление 1: я должен также упомянуть следующие аспекты:
- что для моего FlushMode установлено значение «Нет».
- что базовые данные самого объекта «IProject» основаны на sql-представлении и, следовательно, имеют большинство свойств в сопоставлении, установленном на update = «false»
- что, когда я действительно что-то меняю в объекте и использую тот же метод для сохранения, отправляются операторы обновления sql (и, таким образом, все фиксируется просто отлично)
FlushMode
установлен на NONE? и если это так: почему вы не звонитеsession.Flush()
передtrans.Commit()
? None означает, что Flush никогда не будет коллирован. Никогда, ни на коммит. - person Radim Köhler   schedule 14.05.2014update="false"
, никакие обновления не отправляются? - person dotjoe   schedule 14.05.2014<class name="Foo" table="foo_table" mutable="false">
к вашим сопоставлениям классов. - person Rippo   schedule 14.05.2014mutable=false
на этом этапе, это не будет взломом. В любом случае установитьmutable=false
для отображений представлений — хорошая идея. Эта ссылка также может помочь вам определить, есть ли у вас призрак nhforge.org/blogs/nhibernate/archive/2008/10/20/ - person Rippo   schedule 15.05.2014