NHibernate映射:多对一的用户类型

NHibernate映射:多对一的用户类型,nhibernate,fluent-nhibernate,usertype,compositeusertype,Nhibernate,Fluent Nhibernate,Usertype,Compositeusertype,NHibernate新手,在我们修改现有解决方案以使用此ORM时学习它。 理想情况下,存储结构和对象类需要保持不变,因此我遇到了一两个映射问题 一类“货币”具有价值和货币。该值为双精度,货币为货币列表的外键 货币可以作为一种类型出现在许多对象/表上,因此我创建了一个CompositeUserType来将其与货币的标准映射一起映射。 这很好,但就我个人而言,我无法从NHibernate获得与惰性负载的货币关系。我们使用fluent,但我很乐意使用hbm中的任何指针。看起来我需要使用组件,但看不到如

NHibernate新手,在我们修改现有解决方案以使用此ORM时学习它。 理想情况下,存储结构和对象类需要保持不变,因此我遇到了一两个映射问题

一类“货币”具有价值和货币。该值为双精度,货币为货币列表的外键

货币可以作为一种类型出现在许多对象/表上,因此我创建了一个CompositeUserType来将其与货币的标准映射一起映射。
这很好,但就我个人而言,我无法从NHibernate获得与惰性负载的货币关系。我们使用fluent,但我很乐意使用hbm中的任何指针。

看起来我需要使用组件,但看不到如何添加来自这些或CompositeUserType的引用,尽管:/

更新

我通过使用CompositeUserType并在实体上设置代理端点来解决这个问题,该实体驱动NullSafeGet()方法:


不确定这是否是推荐的方法,但它是有效的:)

只是想提一下-不要添加两个答案。一个就够了-如果发现任何新内容,请编辑它。:)奇怪的是,在你发帖后不到一天,我就试图解决完全相同的问题:一个有金额的货币类型,希望引用货币实体。我不认为这是一个不同寻常的设计。走上了与您相同的道路(CompositeUserType),在如何实现NullSafeGet()方面遇到了难题。你的解决方案有效!(虽然我最终硬编码了entityName——就像“MyNamespace.Currency”那样的FQTN。)也不确定这是否是最好的方法,但是,嘿,它正在工作。感谢您抽出时间更新您的帖子并给出答案!
public virtual object NullSafeGet(IDataReader dr, string[] names, ISessionImplementor session, object owner)
{
    if (dr == null)
    {
        return null;
    }

    Money value = new Money()
    {
        Value = (double)NHibernateUtil.Double.NullSafeGet(dr, names[0], session, owner)
    };

    string entityName = session.BestGuessEntityName(value.Currency);
    value.Currency = (CurrencyDetails)session.InternalLoad(entityName, (object)DEFAULT_CURRENCY_ID, false, false);

    return value;
}