栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用NHibernate进行一对多映射的最小和正确方法

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用NHibernate进行一对多映射的最小和正确方法

仅提供一些提示,总结了我在使用NHibernate时发现的最合适的标准。

1)如果在持久性 (DB列)中 存在 双向* 引用,则也以 双向 代码表示。 __

C#
*

换句话说,如果 孩子 引用了 parent ,那么 父母 应该引用 child

public class Employee{    ...    public virtual IList<Address> { get; set; }}public class Address{    ...    public virtual Employee Employee { get; set; }}

这按原样表示业务域。地址属于雇员,而雇员属于地址。

如果出于某些原因我们确实想限制此限制,则应该进行

protected
修改,但仍将引用保留在
C#

2)使用

inverse="true"
。仅当我们同时映射了两侧(如上)时,才可以使用它,这将导致更多“预期和优化”的INSERT和UPDATE脚本。

在这里阅读更多:

inverse =“ true”示例和 mkyong的解释

3)几乎在任何地方都使用批量获取映射。这样可以避免在查询过程中出现1 + N个问题。阅读更多:

有关批量提取的一些细节

4)如果一个对象

(in our case Employee)
root
另一个对象 没有它就没有多大意义) -使用级联。阅读更多:

nhibernate-通过更新父级创建子级,还是显式创建?

映射摘要中的规则2、3、4:

<class name="Employee" ... batch-size="25">  ...  <bag name="Addresses"       lazy="true"        inverse="true"        batch-size="25"        cascade="all-delete-orphan" >    // wrong! This columns is the same as for many-to-one    //<key column="AddressId" />    // it is the one column expressing the relation    <key column="EmployeeId" />    <one-to-many  />  </bag><class name="Address" ... batch-size="25">  ...  <many-to-one not-null="true" name="Employee" column="EmployeeID" />

3)如果我们使用

inverse="true
,别忘了分配关系的双方 (在创建过程中最关键)

原因是:

我们指示NHibernate-另一边
_(

Address
)_负责持久关系。但是要正确执行此操作,
Address
需要参考
Employee
-才能将其ID保留在“地址”表的列中。

因此,这应该是创建新地址的标准代码

Employee employee = ... // load or create newAddress address = new Address {    ...    Employee = employee, // this is important};Employee.Addresses.Add(address);session.SaveOrUpdate(employee);  // cascade will trigger the rest

我们还可以介绍一些类似的方法

AddAddress()
来隐藏这种复杂性,但是设置双方都是很好的方法。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/568547.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号