标准化后的NHibernate映射

时间:2009-02-26 21:53:22

标签: c# nhibernate fluent-nhibernate nhibernate-mapping

请帮助我 - 我是NHibernate的新手,我似乎无法找到我想要的东西。

我在数据库中有两个表:FundFundBalanceFund可以有多个FundBalancesFundBalance只有一个Fund

在C#中,只有FundBalance类。与Fund表中的列连接的FundBalance表中的列需要映射到FundBalance类的属性。

例如,Fund表包含FundName属性,FundBalance表包含AvailableBalance属性。这两个表已连接,连接的结果需要映射到FundName类的AvailableBalanceFundBalance属性。

问题:如何使用NHibernate执行此操作?额外奖励:如何使用FluentNHibernate指定映射?

我想到的一个解决方案是在数据库中创建一个视图,但如果映射可以纯粹使用NHibernate完成,我会更喜欢它。

6 个答案:

答案 0 :(得分:1)

正如我在评论中提出的那样;这个FundBalance课程怎么样? 那里有什么? 你能用NHibernate映射中的<join table>元素做点什么吗?

例如: http://ayende.com/Blog/archive/2007/04/24/Multi-Table-Entities-in-NHibernate.aspx

答案 1 :(得分:1)

您无需使用视图来解决问题。在FundBalance表上进行映射时,您只需要特定于连接。 如果我的理解是好的,你想让你的FundBalance课程更完整,并拥有基金表中的一些属性。

试试这个:

<class name="FundBalance" table="FundBalance" lazy="true">
        <id name="Id" column="FundBalanceId" unsaved-value="0">
            <generator class="native"/>
        </id>

        <property name="FundBalance" not-null="true" length="80"/>

        <join table="Fund">
            <key column="FundId"/>
            <property name="FundName"/>
        </join>
</class>

对于您的FundBalance实体类,代码将为:

public class FundBalance
{   
        private long _Id;
        public virtual long Id
        {
            get { return _Id; }
            set { _Id = value; }
        }

        private decimal _FundBalance;
        public virtual decimal FundBalance
        {
            get { return _FundBalance; }
            set { _FundBalance= value; }
        }

        private string _FundName;
        public virtual string FundName
        {
            get { return _FundName; }
            set { _FundName= value; }
        }
}

如果您需要更多样本和解释来解决多个表格的问题,请尝试以下链接:

https://svn.sourceforge.net/svnroot/nhibernate/trunk/nhibernate/src/NHibernate.Test/Join/ http://ayende.com/Blog/archive/2007/04/24/Multi-Table-Entities-in-NHibernate.aspx

我给你HBM映射文件,对于流利的nhibernate,我不知道你是否可以使用关键字JOIN但贝司这是同样的问题。

希望这有帮助。

答案 2 :(得分:0)

您没有基金课程的原因是什么?如果这真的很明智,我会重新考虑。

但是如果你想留在那条路线上,那么subselect属性可能会有所帮助(对不起,我从Hibernate docs那里得到了这个,而不是NHibernate,但我希望它们足够相似:http://www.hibernate.org/hib_docs/core/reference/en/html_single/#mapping-declaration-class

我认为这应该适用于选择,更新和删除。但是我不知道插件应该如何工作(独立于Hibernate)谁应该负责决定你是否需要一个新的基金记录,或者当你没有在你的对象模型中正确表示基金表时更新一个(哪个?)

如果你的数据库支持这个,那么(如你自己提到的那样)可以在数据库中创建一个视图并使用“而不是触发器”。

答案 3 :(得分:0)

如果您需要的只是两个表的公共类,为什么不使用façade模式? Map Fund和FundBalance通常会创建一个(未映射的)新类作为两个实体的接口。简单而且没有任何“魔法”。

答案 4 :(得分:0)

如果您只需要阅读,但不能在基金中书写,您可以使用公式。 例如:

通过这种方式,您可以正常使用FundBalances,但不能使用基金

答案 5 :(得分:-1)

这应该使用Hibernates支持继承来完成。 Hibernate可以用几种不同的方式为相关类的族建模,但是一个是基类的表,另一个是每个子类的表来保存它们的附加属性。 在加载时,所有列都会自动加载到指定的子类中 - 因此只使用一个类创建一个伪继承结构,它应该完全按照您的描述进行。