请帮助我 - 我是NHibernate的新手,我似乎无法找到我想要的东西。
我在数据库中有两个表:Fund
和FundBalance
。 Fund
可以有多个FundBalances
而FundBalance
只有一个Fund
。
在C#中,只有FundBalance
类。与Fund
表中的列连接的FundBalance
表中的列需要映射到FundBalance
类的属性。
例如,Fund
表包含FundName
属性,FundBalance
表包含AvailableBalance
属性。这两个表已连接,连接的结果需要映射到FundName
类的AvailableBalance
和FundBalance
属性。
问题:如何使用NHibernate执行此操作?额外奖励:如何使用FluentNHibernate指定映射?
我想到的一个解决方案是在数据库中创建一个视图,但如果映射可以纯粹使用NHibernate完成,我会更喜欢它。
答案 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可以用几种不同的方式为相关类的族建模,但是一个是基类的表,另一个是每个子类的表来保存它们的附加属性。 在加载时,所有列都会自动加载到指定的子类中 - 因此只使用一个类创建一个伪继承结构,它应该完全按照您的描述进行。