私は例外をいくらか理解していますが、それを解決する方法は理解していません。私の並行スレッドのほとんどは、SaveOrUpdateを使用して同じオブジェクトグラフをターゲットにします。その後、いつでも1つのセッションのみを開くことができますか?もしそうなら、どうすれば複数のスレッドにそれを強制できますか?
public class FnhManagerTS
{
private static Configuration cfg;
private static ISessionFactory sessionFactory;
private static string connectionString;
[ThreadStatic]
private static ISession _session = null;
private FnhManagerTS() { }
private static ISession OpenSession()
{
// Create a database connection and open a ISession on it.
return sessionFactory.OpenSession();
}
/// <summary>
/// ThreadStatic ISession.
/// </summary>
/// <returns></returns>
public static ISession Session()
{
if (_session != null && _session.IsOpen)
return _session;
else
{
_session = OpenSession();
return _session;
}
}
レポ:
public class GenericRepoTS<T>
where T : class
{
private ISession session;
public GenericRepoTS()
{
this.session = FnhManagerTS.Session();
}
public void SaveOrUpdate(IList<T> instances)
{
if (instances != null)
{
using (ITransaction transaction = session.BeginTransaction())
{
try
{
lock (instances)
{
foreach (var i in instances)
{
session.SaveOrUpdate(i);
}
transaction.Commit();
}
}
catch (Exception ex)
{
transaction.Rollback();
Trace.TraceError("GenericRepository.SaveOrUpdate IList<" + typeof(T).ToString() + "> ", ex.ToString());
}
}
}
}