NHibernate在从数据库加载和插入到缓存之间修改实体
在NHibernate中是否有拦截器、EventListener或任何在从数据库检索实体之后、插入到二级缓存之前执行的东西 我有一个类,它的属性可能包含以下内容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">
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();
}
}