仅提供一些提示,总结了我在使用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()来隐藏这种复杂性,但是设置双方都是很好的方法。



