【问题标题】:NHibernate mapping: UserTypes with many-to-oneNHibernate 映射:具有多对一的用户类型
【发布时间】:2009-07-09 06:56:20
【问题描述】:

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

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

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

【问题讨论】:

    标签: nhibernate fluent-nhibernate usertype compositeusertype


    【解决方案1】:

    看起来我需要使用组件,但看不到如何从这些组件或 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;
    }
    

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

    【讨论】:

    • 只是想提一下 - 不要添加 2 个答案。一个就足够了 - 如果发现任何新内容,请对其进行编辑。 :)
    • 奇怪的是,在您发布后不到一天,我正在尝试解决 完全相同 问题:具有 Amount 并希望引用货币实体。我不认为这是一个不寻常的设计。沿着你所做的相同路径 (CompositeUserType) 并在如何实现 NullSafeGet() 时感到困惑。您的解决方案有效! (虽然我最终对 entityName 进行了硬编码——只是像“MyNamespace.Currency”这样的 FQTN。)不确定这是否是最好的方式,但是嘿,它正在工作。感谢您花时间更新您的帖子并提供答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多