2012-02-09 2 views
2

Я работаю с C# и nhibernate для доступа к базе данных. У меня есть два или три терминала, которые могут реализовать те же действия, что и редактировать, или удалять объекты из одного и того же БД. Моя проблема заключается в том, что мой терминал не понимает, сделал ли другой терминал какие-либо изменения в базе данных, хотя я снова обновляю данные, выполняющие запросы. Я думаю, что это связано с кешем. Я пробовал команды Flush() и Evict() без каких-либо результатов. Я желаю кто-то может помочь мне, простите за мой английский страшномNHibernate Приведение старых данных

----- Info Добавлено -------

Это C# настольных приложений. Я не вижу никаких ошибок, проблема в том, что когда я редактирую или удаляю, мне нужно знать, был ли объект изменен с другого терминала. и когда я приношу сущность из базы данных, я не вижу изменений в магах с другого терминала до тех пор, пока не перезапустим приложение.

Сеанс создается следующий код:

[PossibleLongOperation] 
     private void DoConnectionWork(string nhibernateConfigPath) 
     { 
      String appPath = Directory.GetParent(Assembly.GetAssembly(GetType()).Location).FullName; 
      String serializablefilePath = Path.Combine(appPath, "configuration.serialized"); 
      try 
      { 
       if (IsConfigurationFileValid(serializablefilePath)) 
       { 
        Configuration = LoadConfigurationFromFile(serializablefilePath); 
       } 
       else 
       { 
        // configuration is immutable, store last returned value 
        Configuration = new Configuration(); 
        Configuration.Configure(nhibernateConfigPath); 
        Configuration.AddAssembly(typeof(ObjectEntity).Assembly); 
        SaveConfigurationToFile(serializablefilePath, Configuration); 
        new SchemaUpdate(Configuration).Execute(true, true); 
        Console.WriteLine(@"Se solicitó la actualización de datos"); 
       } 
       //NHibernateSchemaExport(); 
      } 
      catch (Exception ex) 
      { 
       //if(File.Exists(serializablefilePath)) 
       // File.Delete(serializablefilePath); 
       throw new GenericRepositoryException(string.Format("Error while configuring NHibernate: {0}.", ex.Message), ex); 
      } 

      try 
      { 
       SessionFactory = Configuration.BuildSessionFactory(); 
      } 
      catch (Exception ex) 
      { 
       //if (File.Exists(serializablefilePath)) 
       // File.Delete(serializablefilePath); 
       throw new GenericRepositoryException(string.Format("Error while building NH session factory: {0}.", ex.Message), ex); 
      } 
     } 

---------- Добавлено -------------

это исключение я получаю после Clear() сеанс

09-02-2012 13:22:54|Error|Error: 
NHibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: 394, of entity: Model.Pedido 
    en NHibernate.Engine.StatefulPersistenceContext.CheckUniqueness(EntityKey key, Object obj) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\StatefulPersistenceContext.cs:línea 688 
    en NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformUpdate(SaveOrUpdateEvent event, Object entity, IEntityPersister persister) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultSaveOrUpdateEventListener.cs:línea 227 
    en NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsDetached(SaveOrUpdateEvent event) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultSaveOrUpdateEventListener.cs:línea 186 
    en NHibernate.Event.Default.DefaultUpdateEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultUpdateEventListener.cs:línea 29 
    en NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultSaveOrUpdateEventListener.cs:línea 53 
    en NHibernate.Impl.SessionImpl.FireUpdate(SaveOrUpdateEvent event) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:línea 2666 
    en NHibernate.Impl.SessionImpl.Update(Object obj) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:línea 524 
    en Besnik.GenericRepository.NHibernate.NHibernateUnitOfWork.Update[TEntity](TEntity entity) 
    en Besnik.GenericRepository.GenericRepository`2.Update(TEntity entity) 
    en Services.Services.Implementation.PedidoServiceImpl.<>c__DisplayClass8.<Anular>b__7() en C:\Repositorio\ProyectosCasinoClub\SPMontaPlatosOK\Code\Services\Services\Implementation\PedidoServiceImpl.cs:línea 72 
    en Services.Transaction.Transaction.Execute(Action transactionalAction, Action`1 onException) en C:\Repositorio\ProyectosCasinoClub\SPMontaPlatosOK\Code\Services\Transaction\Transaction.cs:línea 32 
+1

Является ли это веб-приложение, настольное приложение? Как создается контекст сеанса? Вы используете NHibernate для управления версиями? Какие ошибки, если таковые имеются, вы видите, например, 'StaleStateException'? Думаю, нам понадобится дополнительная информация, чтобы я мог дать некоторые четкие ответы на этот вопрос. –

+0

Я добавил необходимую вам информацию. спасибо –

+0

Вот как ваша фабрика сеансов строится из конфигурации, но как насчет ваших сеансов - используете ли вы сеанс на форму, сеанс на поток и т. д.? –

ответ

2

Вы пытались очистить кэш сеанса L1 сеансом.Clear()?

+0

Да, я пробовал это, и это работало для обновления данных, но потом сеанс разбился и начал давать ошибки в других операциях. –

+0

. Ваша сессия не должна длиться так долго, событие if вы делаете сеанс на презентатора/форму или что-то в этом роде. Какие ошибки дает сеанс? –

+0

Я добавил исключение. –

Смежные вопросы