Dear Oskar,

   I was configured at web.config with the following statement
<httpModules>
<add name="NHibernateSessionModule" type="Tec.Web.NHibernateSessionModule"/>
</httpModules>

by thinking that the transaction is begin and close on each request

 public class NHibernateSessionModule : IHttpModule
    {
        public void Init(HttpApplication context) {
            context.BeginRequest += new EventHandler(BeginTransaction);
            context.EndRequest += new EventHandler(CommitAndCloseSession);
        }

          private void BeginTransaction(object sender, EventArgs e) {
            NHibernateSessionFactory.Instance.BeginTransaction();
        }

           private void CommitAndCloseSession(object sender, EventArgs e) {
            try {
                NHibernateSessionFactory.Instance.CommitTransaction();
            } finally {
                NHibernateSessionFactory.Instance.CloseSession();
            }
        }
 }

That's not a proper way right?

Best regards,

Veasna


On Tue, Apr 22, 2014 at 4:40 PM, Oskar Berggren <[email protected]>wrote:

> Just wanted to add that:
>
> a) You should almost always perform your changes inside a transaction.
> b) You do probably not want to sprinkle calls to Flush() in the Delete()
> method or other "low-level" methods. When NH performs a flush it will
> dirty-check all active objects known by the current NH session. Therefore
> flushing too often is bad for performance.
>
> /Oskar
>
>
>
> 2014-04-22 4:12 GMT+02:00 Veasna MUCH <[email protected]>:
>
>> Dear RP,
>>
>> By the way, in Save(T entity) or SaveOrUpdate(T entity), why does the
>> record is save in the database without needed to applied Flush?
>>
>> Is that needed only for deleting record?
>>
>>>         public void Delete(T entity) {
>>>             NHibernateSession.Delete(entity);
>>>             NHibernateSession.Flush();
>>>         }
>>
>>
>>
>> Best regards,
>>
>> Veasna
>>
>>
>> On Monday, April 21, 2014 6:16:03 PM UTC+7, Ricardo Peres wrote:
>>>
>>> This has to do with the FlushMode of the ISession. By default, you have
>>> to explicitly Flush the ISession manually, or, if you start and commit a
>>> transaction, it is done for you.
>>> This is by design, pretty much like Entity Framework, where you have to
>>> call SaveChanges.
>>>
>>> RP
>>>
>>> On Monday, April 21, 2014 11:52:04 AM UTC+1, Veasna MUCH wrote:
>>>>
>>>>    I am very new to NHibernate. I try to use some NH methods. I am
>>>> able to get all records in grid, save new records but no able to delete the
>>>> records from db. Not even getting any kind of exception..
>>>> using the method as  NHibernateSession.Delete(entity); //entity is
>>>> retrieved using GetByAirportCode("A1") //A1 is an code of the record
>>>> that I want to delete. I get object with Code = "A1" but it does not delete
>>>> that record from DB. When I added the code *objAirportDao.CommitChanges();
>>>> *the record is deleted from DB. I do no understand why do I need to
>>>> apply commitchange here? It should be automatically right? if that's the
>>>> need why does the Saving record does not need to applied CommitChange?
>>>>
>>>>
>>>>
>>>> Here is where I call delete object in *default.aspx.cs*
>>>>
>>>>
>>>>
>>>>          protected void Button1_Click(object sender, EventArgs e) {
>>>>>
>>>>                IRepositoryFactory daoFactory = new
>>>> NHibernateDaoFactory();
>>>>
>>>>>             IAirportRepository objAirportDao =
>>>>> daoFactory.GetAirportDao();
>>>>>             Airport objAirport = objAirportDao.GetByAirportCode ("A1");
>>>>
>>>>             if (objAirport != null){
>>>>>
>>>>> *                objAirportDao.Delete(objAirport);
>>>>> //objAirportDao.CommitChanges();    *
>>>>>             }
>>>>
>>>>
>>>>>         }
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> *Class AirportRepository *
>>>>
>>>>
>>>>
>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> * public class AirportRepository :
>>>>> AbstractNHibernateRepository<Airport, int>, IAirportRepository    {
>>>>> public AirportRepository() { }        public Airport
>>>>> GetByAirportCode(string airportCode) {             return 
>>>>> GetByCriteria(new
>>>>> ICriterion[] { Expression.Eq("AirportCode", airportCode
>>>>> )}).ToList<Airport>().FirstOrDefault();            }    }*
>>>>
>>>>
>>>>
>>>> *Class NHibernateSessionFactory*
>>>>
>>>>    public class NHibernateSessionFactory{
>>>>>         public static NHibernateSessionFactory Instance
>>>>>         {
>>>>>             get {
>>>>>                 return Nested.NHibernateSessionFactory;
>>>>>             }
>>>>>         }
>>>>>
>>>>>         private NHibernateSessionFactory(){
>>>>>             InitSessionFactory();
>>>>>         }
>>>>>
>>>>>         private class Nested {
>>>>>             static Nested() { }
>>>>>             internal static readonly NHibernateSessionFactory
>>>>> NHibernateSessionFactory = new NHibernateSessionFactory();
>>>>>         }
>>>>>
>>>>>         private void InitSessionFactory(){
>>>>>             sessionFactory = new Configuration().Configure().
>>>>> BuildSessionFactory();
>>>>>         }
>>>>>
>>>>>         public void RegisterInterceptor(IInterceptor interceptor) {
>>>>>             ISession session = ContextSession;
>>>>>             if (session != null && session.IsOpen)
>>>>>             {
>>>>>                 throw new CacheException("You cannot register an
>>>>> interceptor once a session has already been opened");
>>>>>             }
>>>>>             GetSession(interceptor);
>>>>>         }
>>>>>         public ISession GetSession(){
>>>>>             return GetSession(null);
>>>>>         }
>>>>>
>>>>>         private ISession GetSession(IInterceptor interceptor)  {
>>>>>             ISession session = ContextSession;
>>>>>             if (session == null){
>>>>>                 if (interceptor != null){
>>>>>                     session = sessionFactory.OpenSession(interceptor);
>>>>>                 }else{
>>>>>                     session = sessionFactory.OpenSession();
>>>>>                 }
>>>>>                 ContextSession = session;
>>>>>             }
>>>>>             return session;
>>>>>         }
>>>>>
>>>>>         public void CloseSession(){
>>>>>             ISession session = ContextSession;
>>>>>             if (session != null && session.IsOpen){
>>>>>                 session.Flush();
>>>>>                 session.Close();
>>>>>             }
>>>>>             ContextSession = null;
>>>>>         }
>>>>>
>>>>
>>>>
>>>>>         public void BeginTransaction() {
>>>>>             ITransaction transaction = ContextTransaction;
>>>>>             if (transaction == null){
>>>>>                 transaction = GetSession().BeginTransaction();
>>>>>                 ContextTransaction = transaction;
>>>>>             }
>>>>>         }
>>>>>
>>>>
>>>>
>>>>>         public void CommitTransaction(){
>>>>>             ITransaction transaction = ContextTransaction;
>>>>>             try
>>>>>             {
>>>>>                 if (HasOpenTransaction()) {
>>>>>                     transaction.Commit();
>>>>>                     ContextTransaction = null;
>>>>>                 }
>>>>>             } catch (HibernateException){
>>>>>                 RollbackTransaction();
>>>>>                 throw;
>>>>>             }
>>>>>         }
>>>>>
>>>>
>>>>
>>>>>         public bool HasOpenTransaction(){
>>>>>             ITransaction transaction = ContextTransaction;
>>>>>             return transaction != null && !transaction.WasCommitted &&
>>>>> !transaction.WasRolledBack;
>>>>>         }
>>>>>
>>>>
>>>>
>>>>>         public void RollbackTransaction(){
>>>>>             ITransaction transaction = ContextTransaction;
>>>>>             try
>>>>>             {
>>>>>                 if (HasOpenTransaction()){
>>>>>                     transaction.Rollback();
>>>>>                 }
>>>>>                 ContextTransaction = null;
>>>>>             }
>>>>>             finally
>>>>>             {
>>>>>                 CloseSession();
>>>>>             }
>>>>>         }
>>>>>
>>>>>         private ITransaction ContextTransaction{
>>>>>             get
>>>>>             {
>>>>>                 if (IsInWebContext()){
>>>>>                     return (ITransaction)HttpContext.
>>>>> Current.Items[TRANSACTION_KEY];
>>>>>                 }else{
>>>>>                     return (ITransaction)CallContext.
>>>>> GetData(TRANSACTION_KEY);
>>>>>                 }
>>>>>             }
>>>>>             set
>>>>>             {
>>>>>                 if (IsInWebContext()){
>>>>>                     HttpContext.Current.Items[TRANSACTION_KEY] =
>>>>> value;
>>>>>                 }else{
>>>>>                     CallContext.SetData(TRANSACTION_KEY, value);
>>>>>                 }
>>>>>             }
>>>>>         }
>>>>>
>>>>>         private ISession ContextSession{
>>>>>             get
>>>>>             {
>>>>>                 if (IsInWebContext())
>>>>>                 {
>>>>>                     return (ISession)HttpContext.Current.
>>>>> Items[SESSION_KEY];
>>>>>                 }
>>>>>                 else
>>>>>                 {
>>>>>                     return (ISession)CallContext.GetData(SESSION_KEY);
>>>>>                 }
>>>>>             }
>>>>>             set
>>>>>             {
>>>>>                 if (IsInWebContext())
>>>>>                 {
>>>>>                     HttpContext.Current.Items[SESSION_KEY] = value;
>>>>>                 }
>>>>>                 else
>>>>>                 {
>>>>>                     CallContext.SetData(SESSION_KEY, value);
>>>>>                 }
>>>>>             }
>>>>>         }
>>>>>
>>>>
>>>>
>>>>>         private bool IsInWebContext() {
>>>>>             return HttpContext.Current != null;
>>>>>         }
>>>>>         private const string TRANSACTION_KEY = "CONTEXT_TRANSACTION";
>>>>>         private const string SESSION_KEY = "CONTEXT_SESSION";
>>>>>         private ISessionFactory sessionFactory;
>>>>>     }
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> *Here is my abstract class AbstractNHibernateRepository:*
>>>>
>>>>
>>>>  public abstract class AbstractNHibernateRepository<T, IdT> :
>>>>> IRepository<T, IdT> {
>>>>>
>>>>>
>>>>>
>>>>>    public T GetById(IdT id, bool shouldLock){
>>>>>             T entity;
>>>>>             if (shouldLock) {
>>>>>                 entity = (T)NHibernateSession.Load(persitentType, id,
>>>>> LockMode.Upgrade);
>>>>>             } else {
>>>>>                 entity = (T)NHibernateSession.Load(persitentType, id);
>>>>>             }
>>>>>             return entity;
>>>>>         }
>>>>>
>>>>>         public List<T> GetAll() {
>>>>>             return GetByCriteria();
>>>>>         }
>>>>>
>>>>>         public List<T> GetByCriteria(params ICriterion[] criterion) {
>>>>>             ICriteria criteria = NHibernateSession.
>>>>> CreateCriteria(persitentType);
>>>>>             foreach (ICriterion criterium in criterion)
>>>>>             {
>>>>>                 criteria.Add(criterium);
>>>>>             }
>>>>>             return criteria.List<T>() as List<T>;
>>>>>         }
>>>>>
>>>>>         public List<T> GetByExample(T exampleInstance, params string[]
>>>>> propertiesToExclude)  {
>>>>>             ICriteria criteria = NHibernateSession.
>>>>> CreateCriteria(persitentType);
>>>>>             Example example = Example.Create(exampleInstance);
>>>>>             foreach (string propertyToExclude in propertiesToExclude)
>>>>> {
>>>>>                 example.ExcludeProperty(propertyToExclude);
>>>>>             }
>>>>>             criteria.Add(example);
>>>>>             return criteria.List<T>() as List<T>;
>>>>>         }
>>>>>
>>>>>
>>>>>
>>>>
>>>>>         public T GetUniqueByExample(T exampleInstance, params string[]
>>>>> propertiesToExclude) {
>>>>>             List<T> foundList = GetByExample(exampleInstance,
>>>>> propertiesToExclude);
>>>>>             if (foundList.Count > 1) {
>>>>>                 throw new NonUniqueResultException(foundList.Count);
>>>>>             }
>>>>>             if (foundList.Count > 0){
>>>>>                 return foundList[0];
>>>>>             } else {
>>>>>                 return default(T);
>>>>>             }
>>>>>         }
>>>>>
>>>>>
>>>>>
>>>>
>>>>>         public T Save(T entity){
>>>>>             NHibernateSession.Save(entity);
>>>>>             return entity;
>>>>>         }
>>>>>
>>>>>         public T SaveOrUpdate(T entity) {
>>>>>             NHibernateSession.SaveOrUpdate(entity);
>>>>>             return entity;
>>>>>         }
>>>>>
>>>>>
>>>>
>>>>>         public void Delete(T entity){
>>>>>             NHibernateSession.Delete(entity);
>>>>>         }
>>>>>
>>>>>         public void CommitChanges() {
>>>>>             if (NHibernateSessionFactory.
>>>>> Instance.HasOpenTransaction())
>>>>>             {
>>>>>                 NHibernateSessionFactory.Instance.CommitTransaction();
>>>>>             } else{
>>>>>                 NHibernateSessionFactory.
>>>>> Instance.GetSession().Flush();
>>>>>             }
>>>>>         }
>>>>>
>>>>>         private ISession NHibernateSession{
>>>>>             get {
>>>>>                 return NHibernateSessionFactory.Instance.GetSession();
>>>>>             }
>>>>>         }
>>>>>         private Type persitentType = typeof(T);
>>>>>     }
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>>  --
>> You received this message because you are subscribed to the Google Groups
>> "nhusers" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>>
>> To post to this group, send email to [email protected].
>> Visit this group at http://groups.google.com/group/nhusers.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>  --
> You received this message because you are subscribed to a topic in the
> Google Groups "nhusers" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/nhusers/svafC-vVlAI/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/nhusers.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/nhusers.
For more options, visit https://groups.google.com/d/optout.

Reply via email to