Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
特定区域的Nhibernate清除缓存_Nhibernate_Nhibernate Caches - Fatal编程技术网

特定区域的Nhibernate清除缓存

特定区域的Nhibernate清除缓存,nhibernate,nhibernate-caches,Nhibernate,Nhibernate Caches,我正在尝试手动清除特定区域的2级缓存。我发现这个方法已经发布了。虽然这可以清除我的实体,但由于某些原因,querycache没有被清除。这将导致下一次从数据库检索实体时对每个实体进行单独的查询。当我调用sessionFactory.ReceiveQueries()而不使用任何参数时,If会起作用。仅当我传入特定的区域名称时,它才不起作用。有没有关于出了什么问题的想法 代码来自上述链接: private void ClearRegion(string regionName) {

我正在尝试手动清除特定区域的2级缓存。我发现这个方法已经发布了。虽然这可以清除我的实体,但由于某些原因,querycache没有被清除。这将导致下一次从数据库检索实体时对每个实体进行单独的查询。当我调用sessionFactory.ReceiveQueries()而不使用任何参数时,If会起作用。仅当我传入特定的区域名称时,它才不起作用。有没有关于出了什么问题的想法

代码来自上述链接:

private void ClearRegion(string regionName)
    {
        _sessionFactory.EvictQueries(regionName);

        foreach (var collectionMetaData in _sessionFactory.GetAllCollectionMetadata().Values)
        {
            var collectionPersister = collectionMetaData as NHibernate.Persister.Collection.ICollectionPersister;
            if (collectionPersister != null)
            {
                if ((collectionPersister.Cache != null) && (collectionPersister.Cache.RegionName == regionName))
                {
                    _sessionFactory.EvictCollection(collectionPersister.Role);
                }
            }
        }

        foreach (var classMetaData in _sessionFactory.GetAllClassMetadata().Values)
        {
            var entityPersister = classMetaData as NHibernate.Persister.Entity.IEntityPersister;
            if (entityPersister != null)
            {
                if ((entityPersister.Cache != null) && (entityPersister.Cache.RegionName == regionName))
                {
                    _sessionFactory.EvictEntity(entityPersister.EntityName);
                }
            }
        }
    }

缓存正在工作,并使用NHProfiler进行验证。

好的,所以我解决了我的问题。我没有意识到在查询数据时,除了在实体映射中指定缓存区域外,还需要指定缓存区域。将
.CacheRegion(“regionName”)
添加到我的查询后,一切正常。通过在查询时不添加区域,它将在没有区域名称的情况下进入查询缓存。这就是为什么我在没有区域名称参数的情况下调用
.executeQueries()
时它会起作用

总之,在映射实体时(
.region(“regionName”)
使用Fluent时)以及在使用isession查询时(使用
.CacheRegion(“regionName”)
),需要添加区域名称


谢谢您的回复。

好的,我解决了我的问题。我没有意识到在查询数据时,除了在实体映射中指定缓存区域外,还需要指定缓存区域。将
.CacheRegion(“regionName”)
添加到我的查询后,一切正常。通过在查询时不添加区域,它将在没有区域名称的情况下进入查询缓存。这就是为什么我在没有区域名称参数的情况下调用
.executeQueries()
时它会起作用

总之,在映射实体时(
.region(“regionName”)
使用Fluent时)以及在使用isession查询时(使用
.CacheRegion(“regionName”)
),需要添加区域名称


感谢您的回复。

您是否尝试在nhusers组()中询问?也许您应该共享一些代码和配置以查看问题是否存在。您是否尝试在nhusers组()中询问?也许您应该共享一些代码和配置以查看问题是否存在。