2012-04-05 4 views
0

У меня возникают проблемы с копирующими объектами между несколькими базами данных. Кажется, я не могу понять эту проблему и действительно нуждаюсь в некоторой помощи в реализации.Изменение нескольких баз данных с помощью NHibernate

Моя текущая реализация описана здесь:

Http модуль

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Web; 
using ISMSControl.Infrastructure.Sessions; 
using NHibernate; 
using NHibernate.Context; 

namespace ISMSControl.Infrastructure.Modules 
{ 
    public class SessionModule : IHttpModule 
    { 
     public void Init(HttpApplication context) 
     { 
      context.BeginRequest += OpenSession; 
      context.EndRequest += CloseSession; 
     } 
     private void CloseSession(object sender, EventArgs e) 
     { 
      ISession session = ManagedWebSessionContext.Unbind(HttpContext.Current, SessionManager.GetCurrentSession().SessionFactory); 

      if (session != null) 
      { 
       if (session.Transaction != null && session.Transaction.IsActive) 
        session.Transaction.Rollback(); 
       else 
        session.Flush(); 

       session.Close(); 
      } 
     } 
     private void OpenSession(object sender, EventArgs e) 
     { 
      ManagedWebSessionContext.Bind(HttpContext.Current, 
       SessionManager.GetCurrentSession()); 
     } 
     public void Dispose() 
     { 
     } 
    } 
} 

SessionManager

реализации внешних
using System; 
using System.Collections.Generic; 
using System.Configuration; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Web; 
using FluentNHibernate.Cfg; 
using FluentNHibernate.Cfg.Db; 
using ISMSControl.Infrastructure.Mappings; 
using NHibernate; 
using NHibernate.Cache; 

namespace ISMSControl.Infrastructure.Sessions 
{ 
    public sealed class SessionManager 
    { 
     private const string CurrentSessionKey = "nhibernate.current_session"; 
     private static readonly ISessionFactory sessionFactory; 

     static SessionManager() 
     { 
      sessionFactory = CreateSessionFactory("source"); 
     } 

     private static ISessionFactory CreateSessionFactory(string connectionStringName) 
     { 
      return Fluently.Configure() 
       .Database(MsSqlConfiguration.MsSql2008.ShowSql().ConnectionString(c => c.FromConnectionStringWithKey(connectionStringName))) 
       .CurrentSessionContext("managed_web") 
       .Cache(c => 
       { 
        c.UseQueryCache(); 
        c.ProviderClass<HashtableCacheProvider>(); 
       }) 
       .Diagnostics(d => 
       { 
        d.Enable(); 
        d.OutputToConsole(); 
       }) 
       .Mappings(m => m.FluentMappings.AddFromAssemblyOf<StandardMapping>()) 
       .BuildSessionFactory(); 
     } 

     public static ISession GetCurrentSession() 
     { 
      HttpContext context = HttpContext.Current; 
      ISession currentSession = context.Items[CurrentSessionKey] as ISession; 

      if (currentSession == null) 
      { 
       currentSession = sessionFactory.OpenSession(); 
       context.Items[CurrentSessionKey] = currentSession; 
      } 

      return currentSession; 
     } 
     public static void CloseSession() 
     { 
      HttpContext context = HttpContext.Current; 
      ISession currentSession = context.Items[CurrentSessionKey] as ISession; 

      if (currentSession == null) 
      { 
       // No current session 
       return; 
      } 
      currentSession.Close(); 
      context.Items.Remove(CurrentSessionKey); 
     } 
     public static void CloseSessionFactory(string sessionFactoryName = null) 
     { 
      if (sessionFactory != null) 
      { 
       sessionFactory.Close(); 
      } 
     } 
    } 
} 

Repository

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Transactions; 
using System.Web; 
using ISMSControl.Domain; 
using ISMSControl.Domain.Contracts; 
using ISMSControl.Infrastructure.Sessions; 
using NHibernate; 
using NHibernate.Context; 

namespace ISMSControl.Infrastructure.Repositories 
{ 
    public class StandardRepository : IStandardRepository 
    { 
     public void SaveOrUpdate(Standard standard) 
     { 
      var session = SessionManager.GetCurrentSession(); 

      using (var transaction = session.BeginTransaction()) 
      { 
       session.SaveOrUpdate(standard); 
       transaction.Commit(); 
      } 
     } 
     public IEnumerable<Standard> RetrieveList() 
     { 
      return SessionManager.GetCurrentSession().CreateCriteria<Standard>().List<Standard>(); 
     } 
     public void CopyTo(string database, Standard standard) 
     { 
      //how do i implement this method, so it will copy the standard entity to the other database? 
     } 
    } 
} 

Проблема в том, что я получаю все эти различные ошибки, например: «Сессия закрыта». «Сущность соглашается на другую транзакцию или что-то в этом роде». «Незаконная попытка связать коллекцию с двумя открытыми сессиями».

Я действительно надеюсь, что кто-то может помочь мне нашу точку меня в правильном направлении путем обмена

  1. Учебник
  2. Пример
  3. т.д.

CopyTo

реализации внешних
public void CopyTo(string sessionFactoryName, Standard standard) 
    { 
     //gets a new session for the destination database from the destination sessionfactory. 
     using (var destinationSession = SessionFactoryContainer.Current.Get(sessionFactoryName).OpenSession()) 
     { 
      //error: no persister for... 
      var newStandard = new Standard(); 
      newStandard.Code = standard.Code; 
      newStandard.Description = standard.Description; 
      newStandard.Explanation = standard.Explanation; 

      destinationSession.Save(newStandard); 
     } 
    } 
+1

Пожалуйста, [не добавляйте подписи или метки в свои сообщения] (http://stackoverflow.com/faq#signatures), и это «много» не «alot». – meagar

ответ

1

В вашем методе «CopyTo» вам необходимо создать сеанс во второй базе данных, глубоко клонировать второй параметр вашего метода и затем присоединить клонированный объект к сеансу, который вы открыли.

+0

Но когда я делаю это и пытаюсь его сохранить, в нем говорится: «Незаконная попытка связать коллекцию с двумя открытыми сеансами». Или будет клонирование объекта решить эту проблему? –

+0

Не могли бы вы написать код, который вы написали? – schglurps

+0

Я обновил свой вопрос. Теперь я получаю сообщение «Нет persister для: ISMSControl.Infrastructure.Dto.StandardDto». Должен ли я создать класс сопоставления для этого объекта? –