Sorry, my question with a long code:
    #region Entities
    public class E1
    {
        private ISet<E2> _e2Datas = new HashedSet<E2>();
        public virtual long Id { get; protected set; }
        public virtual string Name { get; set; }
        public virtual ISet<E2> E2Datas
        {
            get { return new ImmutableSet<E2>(_e2Datas); }
            protected set { _e2Datas = value; }
        }
        public virtual void AddE2(E2 е2)
        {
            if (!_e2Datas.Contains(е2)) _e2Datas.Add(е2);
        }
    }

    public class E2
    {
        public virtual long Id { get; protected set; }
        public virtual string Name { get; set; }
    }

    #endregion

    #region Infrastructure&DAOs

    public sealed class NHibernateHelper
    {
        private const string SESSION_KEY = "_NHibernate.ISession";
        private const string TRANSACTION_KEY =
"_NHibernate.ITransaction";
        private static readonly string _uniqueName =
Guid.NewGuid().ToString();
        private static readonly string _nameSession = _uniqueName +
SESSION_KEY;
        private static readonly string _nameTransaction = _uniqueName
+ TRANSACTION_KEY;
        private static Configuration _configuration;
        private static ISessionFactory _sessionFactory;
        public static ISessionFactory SessionFactory
        {
            get { return _sessionFactory; }
        }
        public static Configuration Configuration
        {
            get { return _configuration; }
        }
        public static ISession Session
        {
            get
            {
                ISession session = (ISession)
ContextHelper.Get(_nameSession);
                if (session == null)
                {
                    session = SessionFactory.OpenSession();
                    ContextHelper.Set(_nameSession, session);
                }
                return session;
            }
        }
        public static void CloseSession()
        {
            ISession session = (ISession)
ContextHelper.Get(_nameSession);
            ContextHelper.Set(_nameSession, null);
            if (session != null && session.IsOpen)
            {
                session.Close();
            }
        }
        public static void BeginTransaction()
        {
            ITransaction tx = (ITransaction)
ContextHelper.Get(_nameTransaction);
            if (tx == null)
            {
                tx = Session.BeginTransaction();
                ContextHelper.Set(_nameTransaction, tx);
            }
        }
        public static void CommitTransaction()
        {
            ITransaction tx = (ITransaction)
ContextHelper.Get(_nameTransaction);
            if (tx != null && !tx.WasCommitted && !tx.WasRolledBack)
                tx.Commit();
            else
                throw new Exception();
            ContextHelper.Set(_nameTransaction, null);
        }
        public static void RollbackTransaction()
        {
            ITransaction tx = (ITransaction)
ContextHelper.Get(_nameTransaction);
            ContextHelper.Set(_nameTransaction, null);
            if (tx != null && !tx.WasCommitted && !tx.WasRolledBack)
                tx.Rollback();
            CloseSession();
        }
        private static Configuration BuildConfig(IEnumerable<Assembly>
assemblies)
        {
            Configuration cfg = new Configuration();
            FluentConfiguration t = Fluently.Configure(cfg);
            foreach (Assembly assembly in assemblies)
            {
                Assembly assembly1 = assembly;
                t = t.Mappings(m =>
m.FluentMappings.AddFromAssembly(assembly1));
            }
            return t.BuildConfiguration();
        }
        public static void Init(IEnumerable<Assembly> assemblies)
        {
            RollbackTransaction();
            _configuration = BuildConfig(assemblies);
            _sessionFactory = _configuration.BuildSessionFactory();
        }
        private static class ContextHelper
        {
            public static object Get(string key)
            {
                return CallContext.GetData(key);
            }

            public static void Set(string key, object data)
            {
                CallContext.SetData(key, data);
            }
        }
    }

    public class DAO<T>
    {
        public DAO()
        {
            NHibernateHelper.BeginTransaction();
        }
        public virtual INHibernateQueryable<T> Linq()
        {
            ISession session = NHibernateHelper.Session;
            return session.Linq<T>();
        }
        public virtual void Update(T entity)
        {
            NHibernateHelper.Session.SaveOrUpdate(entity);
        }
    }

    public class E1DAO : DAO<E1>
    {
    }

    public class E2DAO : DAO<E2>
    {
    }

    #endregion

    #region FluentNHibernate mapping

    public class E1Map : ClassMap<E1>
    {
        public E1Map()
        {
            Id(x => x.Id);
            Map(x => x.Name);
            HasManyToMany(x => x.E2Datas).Cascade.All()
                .LazyLoad()
                
.Access.ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore);
        }
    }

    public class E2Map : ClassMap<E2>
    {
        public E2Map()
        {
            Id(x => x.Id);
            Map(x => x.Name);
        }
    }

    #endregion

Not work:
[Test] public void T_003_WithNHibernateHelper()
        {
            //NHibernateHelper.BeginTransaction();
            E2DAO e2DAO = new E2DAO();
            E1DAO e1DAO = new E1DAO();
            E1 e1 = e1DAO.Linq().FirstOrDefault();
            E2 e2 = e2DAO.Linq().FirstOrDefault(x => x.Name ==
"E2-2");
            e1.AddE2(e2);                        //<---
System.NotSupportedException : Object is immutable.
            e1DAO.Update(e1);
            NHibernateHelper.CommitTransaction();
            NHibernateHelper.CloseSession();
        }
Work:
[Test] public void T_002_WithNHibernateHelper()
        {
            //NHibernateHelper.BeginTransaction();
            E2DAO e2DAO = new E2DAO();
            E1DAO e1DAO = new E1DAO();
            E2 e2 = e2DAO.Linq().FirstOrDefault(x => x.Name ==
"E2-1"); //<--- Reversed
            E1 e1 = e1DAO.Linq().FirstOrDefault();     //<--- Reversed
            e1.AddE2(e2);
            e1DAO.Update(e1);
            NHibernateHelper.CommitTransaction();
            NHibernateHelper.CloseSession();
        }
and this work:
[Test] public void T_003_WithoutNHibernateHelper()
        {
            using (ISession ses = NHibernateHelper.Session)
            using (ITransaction tran = ses.BeginTransaction())
            {
                E1 e1 = ses.Linq<E1>().FirstOrDefault();
                E2 e2 = ses.Linq<E2>().FirstOrDefault(x => x.Name ==
"E2-1");
                e1.AddE2(e2);
                ses.SaveOrUpdate(e1);
                tran.Commit();
                NHibernateHelper.CloseSession();
            }
        }

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en.

Reply via email to