NHibernate一对多的例子.这是代码气味吗
本文关键字:代码 一对多 NHibernate | 更新日期: 2023-09-27 18:28:05
最近我发现了一个关于NHibernate一对多关系的例子。映射如下:
<class name="Company" table="Company">
<id name="Id" type="Int32" unsaved-value="0">
<generator class="identity"/>
</id>
<version name="Version"/>
<property name="Name"/>
<set name="Customers" inverse="true" lazy="true" >
<key column="Id"/>
<one-to-many class="Customer"/>
</set>
</class>
<class name="Customer" table="Customer">
<id name="Id" type="Int32" unsaved-value="0">
<generator class="identity"/>
</id>
<version name="Version"/>
<property name="DateOfBirth"/>
<property name="FirstName"/>
<property name="Surname"/>
<many-to-one name="Company" column="CompanyId" cascade="all-delete-orphan"/>
</class>
这是类:
public class Company
{
private ISet<Customer> customers = new HashedSet<Customer>();
public int Id { get; set; }
public string Name { get; set; }
public int Version { get; set; }
public ISet<Customer> Customers
{
get { return customers; }
set { customers = value; }
}
}
public class Customer
{
public Company Company { get; set; }
public DateTime? DateOfBirth { get; set; }
public string FirstName {get;set;}
public int Id { get; set; }
public string Surname {get;set;}
public int Version { get; set; }
}
我不喜欢这个代码的地方是在子代码中包含父对象,在Customer对象中包含整个Company对象。这不是一个循环引用吗。我的意思是,当这个图加载时,我不能做一些像currentCustomer.Company.Customers.First().Company.Customers.Last()之类的事情吗?或者它不是那样工作的?
假设基础表Customer只有一个字符串列CompanyName,我该如何映射它?如果我在Customer类中有一个公共字符串CompanyName,而不是一个公共的Company Company,映射会如何?
是的,你可以写:
currentCustomer.Company.Customers.First().Company.Customers.Last()
在一个打开的会话中,无论您想要多少次,这都会发出一个加载公司的查询,然后(可能是一个)获取Customers集合,然后所有这些都将在内存中发生。除了可能没有那么有用之外,它没有什么奇怪的。如果您只有一个公司名称,是的,您可以将其映射为字符串类型的简单属性。