与NHibernate拦截器和DynamicProxy混合在边表数据中

| 我正在处理一个问题,在这个问题中,我有许多实体,每个实体都有一个对应的一对多转换表,该表指定了实体字段的本地化版本。 (所有这些都是遗留模式,我将在其之上添加地图)。例如: 事件 ID 事件翻译 事件ID 语言 标题 其他领域 因此,如果我要用希腊语呈现信息,我将加入两个表并指定Language = \'Greek \'并拥有所有正确的内容。 我要做的是构建即时混合,将正确的数据直接合并到单个对象中,然后将其作为查询结果返回,例如:
var someEvent = session.CreateCriteria<Event>().SetMaxResults(1).UniqueResult<IEvent>();
Console.WriteLine(someEvent.Title);
为此,我正在尝试设置NHibernate拦截器以创建DynamicProxy mixins。除非它不起作用,而且我不知道为什么。这是设置,这是我能简化的最好的设置。 这里的活动:
class Event : IEventEntity {
   //ID and props here
   public IList Translations {get; set;}
}
IEvenEntity
还有一个用于列表的获取器和设置器。还有一个
EventTranslation
类,它非常简单,并且以最明显的方式实现了
IEventTranslation
。 活动的流利地图:
class EventMap : ClassMap<Event>{
  //obvious ID and properties stuff here...
  HasMany<EventTranslation>(x => x.Translations);
}
可以正常运行-我可以查询事件并导航到其翻译。我很确定映射是好的。 我根据KrzysztofKoźmic的很酷的指南来制作拦截器的形状,以做一些与之相关的事情。首先,我创建了一个要使用动态代理实现的超级接口:
public interface IEvent : IEventEntity, IEventTranslation{}
这是我的NH拦截器。显然,我很疯狂:
public class EventInterceptor : NHibernate.EmptyInterceptor
{
    private readonly static ProxyGenerator gen = new ProxyGenerator();

    public override object Instantiate(string clazz, NHibernate.EntityMode entityMode, object id)
    {
           var mixin = gen.CreateClassProxy(typeof(object), new[] { typeof(IEvent) }, new DynInterceptor());
                    //would also need to set the identifier here
            return mixin;
    }
}
DynInterceptor是一个拦截器,它实际上负责进入关系包,获取正确的转换并返回正确的值的工作。这些细节不太相关,因为它永远不会被调用。 系好NH拦截器后,我看到它正在运行,实际上NH正确地将对象强制转换为
IEvent
(即,至少正在创建代理)。但是由于某种原因,它完全弄糟了为实体充水:
Unhandled Exception: NHibernate.PropertyAccessException: could not set a property value by reflection setter of Event.Translations ---> System.Reflection.TargetException: Object does not match target type.
   at System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invoke
Attr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisib
ilityChecks)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invoke
Attr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, B
indingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, O
bject[] index)
   at NHibernate.Properties.BasicPropertyAccessor.BasicSetter.Set(Object target,
 Object value) in C:\\thirdparty\\NHibernate\\src\\NHibernate\\Properties\\BasicProper
tyAccessor.cs:line 304
在我看来,这是行不通的,因为NH使用反射来设置属性,但是,当然,目标类型是错误的,因为我将IEvent换成了Event。有办法解决这个问题吗? 另外,就基本方法而言,在NH中是否有更好的方法呢?     
已邀请:
        好的,所以对于我提出这个问题有多复杂,事实证明它很简单,如果我足够了解,我可能会问这个问题,因为“我如何动态地使对象实现另一个接口而又不丢失其接口”类型?\”。答案是要提供一个目标,例如
Type type = Type.GetType(clazz, false);
var mixin = (Event)gen.CreateClassProxy(type, new[] { typeof(IEvent) }, new DynInterceptor());
    
        我不确定,但是我认为您应该结合使用过滤器和事件监听器来获得所需的结果。如果在语言表上设置过滤器,并使用事件监听器在要启用过滤的事件之前启用过滤器,则可能会得到所需的行为。     

要回复问题请先登录注册