2011-01-03 5 views
2

Есть ли какая-либо архитектурная или философская причина, почему NHibernate не поддерживает поддержку объектов самоконтроля? Отслеживание изменений на основе сеанса велико, но в некоторых редких случаях оно не используется (например, большое количество сущностей в сеансе, но только одна сущность изменена за транзакцию).Объекты NHibernate и самостоятельного отслеживания

Что вы думаете? Благодарю.

ответ

0

Я действительно не знаю, что означает «объекты самоконтроля», я предполагаю, что это происходит из структуры сущности? IStatelessSession не кэширует объекты. Сессия не построена, чтобы иметь много объектов в кеше, но содержать только объекты, отображаемые на экране пользователю. Если вам нужны пакетные или длительные транзакции, другие инструменты будут работать лучше, чем NHiberante. Я думаю, что это не построено в NHiberante по следующим причинам:

  • Люди уже используют другие инструменты.
  • Существует мало существующего кода, и для его создания не существует много существующих функций.
  • Существующие функции требуют нарушения или должны быть принесены в жертву.
  • Кто-то должен написать код ...
0

Существует принципиальное различие между NHibernate и Entity-Framework. Метод ObjectContext.SaveChanges (..) EF сохраняет только изменения, внесенные в объект, пока он был частью контекста объекта. Пример:

MyEntity e = new MyEntity(); 
e.Key = blabla; 
e.Id = 3242342; 
e.Name = "Hugo"; 
using(MyObjectContext ct = new MyObjectcontext()) 
{ 
    ct.MyEntity.Attach(e); 
    ct.SaveChanges(); 
} 

Это не изменит дб вообще, потому что без изменений, где сделанные в сущности, пока она была частью контекста. В NHibernate значение Hugo будет сохранено в db. В Nhibernate нет необходимости в объектах самоконтроля.

+0

Когда у вас есть длинная живая сессия, полная объектов (например, 100k), и вы изменяете только некоторые из них, тогда грязная проверка занимает слишком много времени. В этом случае самообучающиеся объекты будут ИМО. Я не уверен, что неплохо играть с такими долгими жизненными сессиями :). –

1

Вы также можете обратиться к методу FindDirty от IInterceptor. Здесь вы можете ввести свой собственный грязный механизм слежения, не влияя на бизнес-логику и не отказываясь от каких-либо других функций NH.

+0

Спасибо за интересную идею. Есть ли в слушателях аналогия метода FindDirty? –

Смежные вопросы