NHibernate二级缓存在没有缓存配置的情况下缓存实体

标签 nhibernate fluent-nhibernate

我已经在 session 工厂上配置了二级缓存。但是对于 POCO 实体,我没有启用缓存。

我使用 Fluent NHibernate 来配置 SessionFactory 和 POCO 实体。

这是 session 工厂的配置:

            var cfg = Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008.ConnectionString(connectionString)
                          .Provider("NHibernate.Connection.DriverConnectionProvider, NHibernate")
                          .Dialect<CustomMsSql2008Dialect>()
                          .Driver<SqlAzureClientDriver>()
                          .ShowSql())
            .Cache(x =>
                {
                    x.UseQueryCache();
                    x.UseSecondLevelCache().ProviderClass<HashtableCacheProvider>().UseMinimalPuts();
                })

POCO实体配置如下:

        public CustomerConfiguration()
    {
        Table("Sys_Customer");
        DynamicUpdate();

        Id(x => x.Id).GeneratedBy.GuidComb().UnsavedValue(Guid.Empty);

        Map(x => x.Code);
        Map(x => x.Name);
        Map(x => x.IsActive);
        Component(x => x.Contact).ColumnPrefix("Contact_");
        Component(x => x.Address).ColumnPrefix("Address_");
        Map(x => x.IsDeleted);
        Map(x => x.CreatedOn).Column("CreatedOn");
        Map(x => x.CreatedBy).Column("CreatedBy").Length(100);
        Map(x => x.LastModifiedOn).Column("LastModifiedOn");
        Map(x => x.LastModifiedBy).Column("LastModifiedBy").Length(100);

        Version(x => x.RowVersion).UnsavedValue("0");
    }

很明显,对于 Sys_Customer 实体,我没有配置任何缓存,但是当我运行以下代码时:数据库仅被命中一次:

        using (ISession s = RepositorySession)
        {
            var f = s.Get<Customer>(new Guid("75EDC0C2-4E58-43FF-B0D8-8C52FBB2D502"));
            var d = f.Code;
        }

        using (ISession s = RepositorySession)
        {
            var f = s.Get<Customer>(new Guid("75EDC0C2-4E58-43FF-B0D8-8C52FBB2D502"));
            var d = f.Code;
        }

当我从 SessionFactory 中删除缓存配置时,数据库会被命中两次。很明显该实体被缓存在二级缓存中。

有人可以告诉我如何避免将实体缓存到NHibernate的二级缓存中吗???

最佳答案

我有配置了二级缓存的 ClassConvention。它看起来如下:

    public class ClassConvention : IClassConvention
{
    /// <summary>
    /// Applies the specified instance.
    /// </summary>
    /// <param name="instance">The instance.</param>
    public void Apply(IClassInstance instance)
    {
        instance.Table(instance.EntityType.Name);
        instance.LazyLoad();
        instance.Cache.NonStrictReadWrite();
    }
}

这导致实体被缓存到二级缓存中。我从 IClassConvention 中删除了配置,现在它按预期工作

关于NHibernate二级缓存在没有缓存配置的情况下缓存实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17952257/

相关文章:

c# - 为什么 NHibernate 需要 "protected internal"自动属性的可见性?

NHibernate:System.Argument 异常:已添加具有相同键的项目

c# - Nhibernate可以从数据库自动生成映射文件吗?

c# - 现有类(class)的精简版

c# - NHibernate.Exceptions.GenericADOException 为什么?

更新到数据库后 NHibernate 查询缓存不起作用

.net - 将审计列添加到 Fluent NHibernate 多对多联结表

fluent-nhibernate - 在 StructureMap 中使用依赖注入(inject)时,如何在多个构造函数中进行选择?

c# - NHibernate 尝试在删除操作中将 ID 更新为 null

unit-testing - 用于测试的 NHibernate Load 与 Get 行为