NHibernate带来旧数据

时间:2012-02-09 15:12:30

标签: c# nhibernate caching

我正在使用c#和nhibernate来访问数据库。 我有两个或三个可以实现相同操作的终端,例如编辑或从同一个DB中删除实体。 我的问题是我的终端没有意识到另一个终端是否对数据库进行了任何更改,尽管我刷新了再次执行查询的数据。 我认为这是由于缓存。 我尝试了没有结果的Flush()和Evict()命令。 我希望有人可以帮助我,对不起我可怕的英语

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

这是一个c#桌面应用程序。 我没有看到任何错误,问题是当我编辑或删除时我需要知道该实体是否是从另一个终端修改的。当我从数据库中带来实体时,我不会看到从另一个终端做出的更改,直到y重新启动应用程序。

会话由下一个代码创建:

[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 个答案:

答案 0 :(得分:2)

您是否尝试通过session.Clear()?

清除L1会话缓存