使用NHibernate 2.0.1插入子表

使用NHibernate 2.0.1插入子表,nhibernate,Nhibernate,我本周开始使用(挣扎)。我有一个包含3个表的小应用程序(我现在使用2个表)。表currency和表country以下是映射文件 <class name="dataprovider.Country,dataprovider" table="country"> <id name="CountryId" column="country_id" unsaved-value="0"> <generator class="native"/>

我本周开始使用(挣扎)。我有一个包含3个表的小应用程序(我现在使用2个表)。表
currency
和表
country
以下是映射文件

<class name="dataprovider.Country,dataprovider" table="country">
    <id name="CountryId" column="country_id" unsaved-value="0">
        <generator class="native"/>
    </id>
    <!--<bag name="BatchList" inverse="true" lazy="true" >
        <key column="country_id" />
        <one-to-many class="Batch" />
    </bag>
    <bag name="PrinterList" inverse="true" lazy="true" >
        <key column="country_id" />
        <one-to-many class="Printer" />
    </bag>-->
    <many-to-one name="CurrencyId" column="currency_id" class="Currency"  cascade="save-update"/>
    <!--<property column="currency_id" name="Currency_Id"/>-->
    <property column="name" name="Name"/>
    <property column="region" name="Region" />
    <property column="comments" name="Comments"/>
</class>
问题是:如何使用表货币中现有货币的货币id插入表国家/地区

你们是怎么做到的?我严重卡住了,一个两天的小项目现在要花我一周的时间。

在你的
bag name=“CountryList”
上设置
cascade=“save update”
。如果这不起作用,发布您的
CountryManager.Add()
代码以查看保存过程可能会有所帮助

对于您的第二个问题,如果我理解正确,以下是NHibernate处理映射集合的方式:

您将集合映射为惰性,因此加载对象不会同时加载集合的所有元素。相反,当您第一次访问集合时,NHibernate将查询数据库以填充集合并返回它。所以,当你第一次做这样的事情时:

var countries = currency.CountryList;

NHibernate将以静默方式执行类似于以下内容的查询:

SELECT * FROM country WHERE currency_id = ?
然后构建一个要返回的国家/地区对象集合(并缓存以避免再次运行查询)

基本上,通过映射文件,您已经向NHibernate介绍了您的两个实体(国家和货币)以及它们之间的关系,以便它知道如何构建查询以访问数据。类似地,它跟踪集合中的内容,因此当您添加或删除项时,它可以比较更改的内容并执行适当的INSERT或remove语句


因此,使用NHibernate映射的集合的方法是像使用普通的.NET集合一样使用它们。随意添加和删除项目。完成后,请确保告诉NHibernate保留对数据库所做的更改,方法是对添加/删除的每个项目调用
session.Save()
session.Delete()
,或者(如果您设置了级联,就像您所做的那样)简单调用
session.Save()
在包含集合的父对象上。

我的级联在这边:

<many-to-one name="CurrencyId" column="currency_id" class="Currency"  cascade="save-update"/>

在我更改它之后,它一开始不起作用,即使我重新构建了解决方案。然后我在
Currency\u test
类中做了另一个测试:
can\u-get\u-Currency\u-by\u-id
调用相同的函数
getcurrencybyid
,我可以拥有一个对象,而在
中can\u-add\u-new\u-country
相同的函数返回空值

然后我意识到
Country\u Test[Setup]
Currency\u Test
的ExportSchema没有及时创建数据库,以便
可以添加新的产品
以拥有货币对象。这就是它返回空对象的原因


现在不要滥用;但是你能告诉我如何使用IListCountryList吗?我不知道我是否说得很好。据我所知,它应该使用相同的
货币
(货币id参考)存储所有
国家
对象。NHibernate是如何做到这一点的?

我更新了我的答案,希望它能回答您提出的问题。谢谢,我已经读过了。现在有点清楚了。我想知道,既然Jboss似乎已经购买了hibernate,NHibernate会怎么样。再次感谢你,伙计!
foreach (Country country in currency.CountryList)
SELECT * FROM country WHERE currency_id = ?
<many-to-one name="CurrencyId" column="currency_id" class="Currency"  cascade="save-update"/>