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.