0

请帮助我——我是 NHibernate 的新手,我似乎找不到我要找的东西。

我在数据库中有两个表:FundFundBalance. AFund可以有很多FundBalances,而 aFundBalance只有一个Fund

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

例如,Fund表包含FundName属性,FundBalance表包含AvailableBalance属性。这两个表是join的,join的结果需要映射到类的FundNameandAvailableBalance属性上FundBalance

问题:我如何用 NHibernate 做到这一点?奖励:如何使用 FluentNHibernate 指定映射?

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

4

6 回答 6

1

正如我在评论中所问的那样;这个 FundBalance 类到底长什么样?里面有什么?你能<join table>对 NHibernate 映射中的元素做些什么吗?

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

于 2009-03-06T21:25:42.377 回答
1

您不需要使用视图来解决您的问题。当您在 FundBalance 表上进行映射时,您只需要具体说明联接。如果我的理解很好,你想让你的 FundBalance 类更完整,并从 Fund Table 中获得一些属性。

试试这个:

<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-在-NHibernate.aspx

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

希望这可以帮助。

于 2009-03-09T15:15:41.587 回答
0

你没有基金课的原因是什么?我会重新考虑这是否真的明智。

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

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

如果您的数据库支持,另一种方法是(正如您自己提到的)在数据库中创建一个视图并使用“而不是触发器”。

于 2009-02-26T22:03:58.233 回答
0

如果您只需要两个表的公共类,为什么不使用外观模式?映射 Fund 和 FundBalance 通常,创建一个(未映射的)新类作为两个实体的接口。简单,不涉及任何“魔法”。

于 2009-02-27T15:42:20.670 回答
0

如果你只需要阅读,而不需要在基金中写,你可以使用一个公式。例如:

这样您就可以正常使用 FundBalances,但不能使用 Funds

于 2009-03-06T21:18:09.167 回答
-1

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

于 2009-03-05T15:04:47.997 回答