NHibernate пример один ко многим.Это запах кода? - PullRequest
0 голосов
/ 16 марта 2012

Недавно я нашел пример отношения 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; }
}

Что мне не нравится в этом коде, так это включение родительского элемента в дочерний элемент,Весь объект Компании внутри Заказчика.Не будет ли это круговой ссылкой.Я имею в виду, что при загрузке этого графика я не смогу сделать что-то вроде currentCustomer.Company.Customers.First (). Company.Customers.Last () ... и так далее?Или это так не работает?

Предполагая, что в базовой таблице у Клиента есть только строковый столбец CompanyName, как мне это отобразить?Каким было бы сопоставление, если бы вместо публичной компании Company была бы открытая строка CompanyName в классе Customer?

1 Ответ

5 голосов
/ 16 марта 2012

да, вы можете написать:

currentCustomer.Company.Customers.First().Company.Customers.Last() 

столько раз, сколько вы хотите в открытом сеансе, это выдаст запрос для загрузки компании, затем (вероятно, один) для получения коллекции клиентов, а затемвсе произойдет в памяти.В этом нет ничего странного, кроме того факта, что, вероятно, это не так полезно.Если у вас просто есть название компании, вы можете отобразить его как простое свойство типа string.

...