NHibernate一对多的例子.这是代码味吗?

CMP*_*rez 0 c# nhibernate nhibernate-mapping

最近我发现了一个关于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>
Run Code Online (Sandbox Code Playgroud)

这是课程:

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; }
}
Run Code Online (Sandbox Code Playgroud)

我不喜欢这段代码的内容是将父项包含在子项中,将整个Company对象包含在Customer项中.这不是一个循环的参考.我的意思是,当这个图加载时我不能做像currentCustomer.Company.Customers.First().Company.Customers.Last()......等等?或者它不像那样工作?

假设基础表Customer只有一个字符串列CompanyName,我该如何映射?如果不是公共公司公司,我在Customer类中有公共字符串CompanyName,那么映射怎么样?

Fel*_*ano 5

是的你可以写:

currentCustomer.Company.Customers.First().Company.Customers.Last() 
Run Code Online (Sandbox Code Playgroud)

在开放会话中你需要多少时间,这将发出一个用于加载公司的查询,然后(可能是一个)用于获取Customers集合,然后所有这些都将在内存中发生.除了事实上可能不那么有用之外,没有什么比这更奇怪了.如果您只有公司名称,则可以将其映射为字符串类型的简单属性.