nhibernate - Create child by updating parent, or create explicitly?

谁说我不能喝 提交于 2019-11-28 13:01:49
Radim Köhler

Not sure what would be the "preferred method" (it could depend on who does prefer). But I can share my way

If the parent is a root entity, then we should save all the reference tree in in one shot: session.SaveOrUpdate(parent).

E.g. Employee has collection of Educations. In such case, it should go like this

  1. create Education give it reference to employee,
  2. Add() it to collection employee.Educations.
  3. Have/make the mapping inverse, cascade="all-delete-orphan" ...
  4. NHibernate will do what we expect on session.SaveOrUpdate(parent)

Some snippets in xml:

<class name="Employee" table="..." lazy="true" 
  optimistic-lock="version" dynamic-update="true" batch-size="25" >

  <cache usage="read-write" region="ShortTerm"/>
  <id name="ID" column="Employee_ID" generator="native" />

  <bag name="Educations" lazy="true" inverse="true" 
       batch-size="25" cascade="all-delete-orphan" >
    <key column="Employee_ID" />
    <one-to-many class="Education" />
  </bag>
  ...

And the Education

<class name="Education" table="..." lazy="true" batch-size="25>
  <cache usage="read-write" region="ShortTerm"/>
  <id name="ID" column="Education_ID" generator="native" />

  <many-to-one not-null="true" name="Employee" class="Employee" 
             column="Employee_ID" />
...

in fluent:

public class EmployeeMap : ClassMap<Employee>
{
  public EmployeeMap()
  {
      BatchSize(25)
      ...
      HasMany(x => x.Educations)
        .AsBag()
        .BatchSize(25)
        .LazyLoad() 
        .Cascade.AllDeleteOrphan() 
        .Inverse()
        .KeyColumn("Employee_ID")

public class EducationMap : ClassMap<Education>
{
  public EducationMap()
  {
     ...
     References(x => x.Employee, "Employee_ID")
          .Not.Nullable()
          ...

And now the C# relations:

// business
var employee = ...;
var education = new Education
{
   Employee = employee, 
   ...
};
employee.Educations.Add(education);

// DAO
session.SaveOrUpdate(employee);

If the parent is not root, there is just a relation (Employee has collection of Subordinates of type Employee), keep the persisting separated

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!