NHibernate在从数据库加载和插入到缓存之间修改实体

NHibernate在从数据库加载和插入到缓存之间修改实体,nhibernate,Nhibernate,在NHibernate中是否有拦截器、EventListener或任何在从数据库检索实体之后、插入到二级缓存之前执行的东西 我有一个类,它的属性可能包含以下内容 Lorem ipsum <c:link type="tag" id="123" /> dolor sit amet 我需要运行插件将其转换为 Lorem ipsum <a class="tag-link" href="/tags/tag-name/" title="Description of the tag">

在NHibernate中是否有拦截器、EventListener或任何在从数据库检索实体之后、插入到二级缓存之前执行的东西

我有一个类,它的属性可能包含以下内容

Lorem ipsum <c:link type="tag" id="123" /> dolor sit amet
我需要运行插件将其转换为

Lorem ipsum <a class="tag-link" href="/tags/tag-name/" title="Description of the tag">Tag name</a> dolor sit amet

如果启用了缓存,我只想执行一次:在将实体插入缓存之前。

是的,NHibernate会公开侦听器和事件侦听器契约。您可以选择使用侦听器事件实现解决方案。我推荐事件监听器。NHibernate在NHibernate.event命名空间中公开了许多事件侦听器协定。请浏览以下事件侦听器合同:-

NHibernate.Event.IPostLoadEventListener NHibernate.Event.ILoadEventListener
我找到了一个可能的解决方案:UserTypes

实体

public class Post : Page
{
    [FormattedText]
    public virtual string Text { get; set; }
}
映射

public class PostMapping : SubclassMap<Post>
{
    public PostMapping()
    {
        Map(x => x.Text);
    }
}
用于映射自定义类型的Fluent NHibernate约定

public class FormattedTextConvention : IPropertyConvention
{
    public void Apply(IPropertyInstance instance)
    {
        if (instance.Property.PropertyType == typeof(string))
        {
            if (instance.Property.MemberInfo.GetCustomAttributes(typeof(FormattedTextAttribute), true).Any())
            {
                instance.CustomType<FormattedText>();
            }
        }
    }
}
创建会话工厂

public class NHibernateThingy
{
    public static ISessionFactory CreateSessionFactory(bool isAdminMapping)
    {
        var config = Fluently.Configure();
        config.Database(/* ... */);
        if (isAdminMapping)
        {
            // don't format strings when editing entities
            // so no FormatTextConvetion here
            config.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Content>());
        }
        else
        {
            // format string when displaying
            config.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Content>().Conventions.Add(typeof(FormattedTextConvention)));
            // use cache to run that heavy text processing only once
            config.Cache(c => c.ProviderClass<SysCacheProvider>().UseSecondLevelCache());
        }

        return config.BuildSessionFactory();
    }
}

我测试了这些事件,它们是在从缓存加载实体后执行的。
public class NHibernateThingy
{
    public static ISessionFactory CreateSessionFactory(bool isAdminMapping)
    {
        var config = Fluently.Configure();
        config.Database(/* ... */);
        if (isAdminMapping)
        {
            // don't format strings when editing entities
            // so no FormatTextConvetion here
            config.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Content>());
        }
        else
        {
            // format string when displaying
            config.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Content>().Conventions.Add(typeof(FormattedTextConvention)));
            // use cache to run that heavy text processing only once
            config.Cache(c => c.ProviderClass<SysCacheProvider>().UseSecondLevelCache());
        }

        return config.BuildSessionFactory();
    }
}