c# - NHibernate 带来旧数据

标签 c# nhibernate caching

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

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

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

session 由以下代码创建:

[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() session 后遇到的异常

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

最佳答案

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

关于c# - NHibernate 带来旧数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9213440/

相关文章:

c# - 为什么要手动双缓冲?

NHibernate - 如何在返回父类(super class)时查询子类属性?

caching - 使用 Cloudfront 时,如何设置相对于当前日期的过期 header ?

javascript - 如何将版本号添加到 HTML 文件(不仅是 css 和 js 文件)

c# - 如何在没有基于任务的代理的情况下处理 Windows Phone 8 中的服务引用

c# - HttpRequestBase 在哪里?

c# - 如何在 nhibernate 中映射有序列表?

c# - protobuf-net:如何在用户 session 中存储

c# - 连接到服务器,保持连接,并在连接丢失时继续重试?

NHibernate 投影、AutoMapping、IPagedList,怎么做?