NHibernate映射:具有多对一的UserTypes

时间:2009-07-09 06:56:21

标签: nhibernate fluent-nhibernate usertype compositeusertype

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

一类“金钱”具有价值和货币。该值为double,货币是货币列表表的外键。

Money可以在许多对象/表格中显示为一种类型,因此我创建了一个CompositeUserType来将其与标准映射到货币一起映射。 这很好,但对于我的生活,我无法从NHibernate获得延迟加载的货币关系。我们使用流利,但我很高兴hbm中的任何指针。

1 个答案:

答案 0 :(得分:4)

看起来我需要使用组件,无法看到如何添加那些或CompositeUserTypes的引用,但是:/

https://forum.hibernate.org/viewtopic.php?f=1&t=947719&start=0

https://web.archive.org/web/20090227235136/http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/08/13/a-fluent-interface-to-nhibernate---part-2---value.aspx

http://wiki.fluentnhibernate.org/show/StandardMappingComponents

<强>更新

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

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;
}

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