NHibernate带来旧数据

问题描述:

我正在与c#和nhibernate访问数据库。 我有两个或三个终端可以实现相同的操作,如编辑或从同一个数据库中删除实体。 我的问题是,我的终端不知道,如果另一个终端在数据库上做了任何更改,但我刷新数据再次执行查询。 我认为这是由于缓存。 我试过了没有结果的Flush()和Evict()命令。 我希望有人能帮助我,对不起我的可怕的英语NHibernate带来旧数据

-----信息添加-------

这是一个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

这是一个Web应用程序,桌面应用程序?如何创建会话上下文?你在使用NHibernate版本控制吗?你看到什么错误,如果有的话,例如'StaleStateException'?我想我们需要更多的信息才能给出一些明确的答案。 – 2012-02-09 15:18:40

+0

我添加了你需要的信息。感谢 – 2012-02-09 15:29:45

+0

这就是你的会话工厂是如何从配置构建的,但你的会话如何? - 你是使用Session per Form,Session per thread等吗? – 2012-02-09 15:56:24

您是否尝试通过session.Clear()清除L1会话缓存?

+0

是的,我尝试过,并且用于更新数据,但是然后会话崩溃并开始在其他操作中发生错误 – 2012-02-09 15:37:31

+0

无论如何,您的会话不应该长时间运行,事件if你正在为每个演示者/表单做些什么。会议会给出什么错误? – 2012-02-09 15:57:54

+0

我添加了这个异常。 – 2012-02-09 16:20:59