使用NHibernate 2.0.1插入子表
我本周开始使用(挣扎)。我有一个包含3个表的小应用程序(我现在使用2个表)。表使用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"/>
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"/>