Nhibernate 获取已启用二级缓存的类和集合的列表

Nhibernate 获取已启用二级缓存的类和集合的列表,nhibernate,second-level-cache,Nhibernate,Second Level Cache,给定对ISessionFactory实例的引用,是否可以获取所有启用了二级缓存的类和集合的列表 编辑: 为我想要实现的目标提供更多的背景: 我想构建一个管理界面,该界面可以提供使用sessionFactory.execute和sessionFactory.executecollection刷新二级缓存部分的功能。可以找到更多信息 例如: 刷新此类型的所有实体 刷新此特定实体 刷新此实体的所有集合 刷新此特定的实体集合 为此,我需要一种方法来动态列出可用于执行刷新操作的实体和实体集合类型。您可

给定对
ISessionFactory
实例的引用,是否可以获取所有启用了二级缓存的类和集合的列表

编辑:

为我想要实现的目标提供更多的背景:

我想构建一个管理界面,该界面可以提供使用
sessionFactory.execute
sessionFactory.executecollection
刷新二级缓存部分的功能。可以找到更多信息

例如:

  • 刷新此类型的所有实体
  • 刷新此特定实体
  • 刷新此实体的所有集合
  • 刷新此特定的实体集合

为此,我需要一种方法来动态列出可用于执行刷新操作的实体和实体集合类型。

您可以使用
GetAllClassMetadata()
GetAllCollectionMetadata()
方法从持久类和集合获取元数据

诀窍在于,您需要将返回的元数据类强制转换为
IEntityPersister
ICollectionPersister
,现在可以在其中检查
Cache
属性,如果为实体/集合配置了缓存,则该属性不应为
null

所以你的眼睛可能会像这样

var cachedEnityTypes = new List<string>();
var cachedCollectionRoles = new List<string>();
foreach (var classMetadata in sessionFactory.GetAllClassMetadata())
{
    var persister = classMetadata.Value as IEntityPersister;
    if (persister != null && persister.Cache != null)
        cachedEnityTypes.Add(persister.EntityName);
}
foreach (var collectionMetadata in nHibernateSessionFactory.GetAllCollectionMetadata())
{
    var persister = collectionMetadata.Value as ICollectionPersister;
    if (persister != null && persister.Cache != null)
        cachedCollectionRoles.Add(collectionMetadata.Value.Role);
}
var cachedEnityTypes=new List();
var cachedCollectionRoles=新列表();
foreach(sessionFactory.GetAllClassMetadata()中的var classMetadata)
{
var persister=classMetadata.Value作为IEntityPersister;
if(persister!=null&&persister.Cache!=null)
Add(persister.EntityName);
}
foreach(nHibernateSessionFactory.GetAllCollectionMetadata()中的var collectionMetadata)
{
var persister=collectionMetadata.Value作为ICollectionPersister;
if(persister!=null&&persister.Cache!=null)
cachedCollectionRoles.Add(collectionMetadata.Value.Role);
}

您还可以获取用于创建
ISessionFactory
配置
对象的引用吗?或者您只有
ISessionFactory
,无法访问
配置
?我的理想方案是使用ISessionFactory实例。但是如果不可能,我可能可以使用配置对象解决问题。也可以使用ISessionFactory解决,请参见下面的答案。因为您没有提到需要从缓存的Entite/集合中获取哪种信息,所以我只提供了一些您开始使用的示例代码。如果您有一些更具体的需要,请将它们包括在问题中,我也会尝试扩展我的答案。@nemesv-请参阅上面的编辑以了解进一步的上下文。我已经用一些代码扩展了我的答案,以收集缓存的实体类型名称和缓存的集合角色,您可以使用它们来执行逐出和逐出集合。除此之外,您还可以在调试器的帮助下探索元数据和持久化器的API,我相信您可以找到所需的任何其他信息。