Jos*_*ata 1 c# nhibernate domain-driven-design nhibernate-mapping
我们正在迁移当前的C#应用程序以使用nHibernate.由于nHibernate提升了纯粹的域驱动设计,我们可以将业务对象添加为类的属性,或者应该继续使用ID.
让我用一个例子说明这一点;
参加以下现有课程.地址(和子项)仅由其ID标识.
public class Person
{
public int PersonID { get; set; }
public string FirstName { get; set; }
public string FirstName { get; set; }
public int AddressID { get; set; }
public List<int> ChildrenIDs { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我们将类转换为使用nHibernate时,我们还希望借此机会更改"Person"类的结构以更好地满足需求.希望nHibernate能够在"引擎盖下"处理所有数据检索
public class Person
{
public virtual int PersonID { get; private set; }
public virtual string FirstName { get; set; }
public virtual string FirstName { get; set; }
public virtual AddressObject Address { get; set; }
public virtual List<ChildrenObject> Children { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我们现在为Person存储一个Address对象和一个Children对象列表.这对我们的业务需求更好,因为我们在访问类时拥有所有信息,我们可以不使用ID,而是使用底层对象.
在这种情况下,nHibernate对Person.Address持续存在什么?它是否只会持久保存在Person表中为该对象指定的唯一ID?那么儿童对象呢?
您应该使用域对象作为属性,例如在您给出的第二个示例中.
NHibernate将坚持独特AddressObject
.该AddressObject
会与一个一对多的关系Person
类想必,所以你应该有一个List
类型Person
的AddressObject
代表类Persons
谁住在这里.这个关系也应该在你的AddressObject.hbm.xml文件中定义,如下所示:
<set name="persons" cascade="all" inverse="true" lazy="true">
<key column="address_id"/>
<one-to-many class="Person"/>
</set>
Run Code Online (Sandbox Code Playgroud)
在Person.hbm.xml中是这样的:
<many-to-one name="address"
class="AddressObject"
column="address_id"/>
Run Code Online (Sandbox Code Playgroud)
另外,为什么有专门针对儿童的课程?如果您的意思是儿童的字面定义,为什么不仅仅Person
为此目的使用该类?