Свободный NHibernate - сопоставление 2 таблиц с одним классом - PullRequest
9 голосов
/ 19 мая 2009

У меня есть структура таблицы что-то вроде этого

table Employees
 EmployeeID
 EmployeeLogin
 EmployeeCustID

table Customers
 CustomerID
 CustomerName

Я хотел бы отобразить приведенную выше структуру в один класс с именем:

Class Employee
 EmployeeID
 EmployeeLogin
 EmployeeName

Как мне это сделать с беглым nhibernate?

Ответы [ 4 ]

4 голосов
/ 19 мая 2009

Я не знаю, возможно ли это с беглым, но в XML вы используете элемент соединения:

упрощенный:

<class name="Employee" table="Customers" >
  <id name="CustomerID" .../>

  <property name="CustomerName"/>

  <join table="Employees">
    <key column="EmployeeCustID" />
    <property name="EmployeeLogin" />
  </join>

</class>

См. сообщение от Ayende

3 голосов
/ 10 сентября 2010

Я согласен с Франсом выше, но если вы застряли с чужим кодом и должны использовать существующую структуру, вы можете использовать WithTable.

public class EmployeesMap : ClassMap<Employees>
{
    public EmployeesMap()
    {
        Id(x => x.EmployeeId);
        Map(x => x.EmployeeLogin);

        WithTable("Customers", join =>
            {
                join.Map(m => m.EmployeeName, "CustomerName");
                join.WithKeyColumn("EmployeeCustID");
            });
    }
}

[DataContract(IsReference = true)]
public class Employees
{
    [DataMember]
    public virtual int EmployeeId { get; set; }

    [DataMember]
    public virtual string EmployeeLogin { get; set; }

    [DataMember]
    public virtual string EmployeeName { get; set; }
}
1 голос
/ 02 сентября 2009

Я не пробовал этого, так как Fluent NHibernate перешел на 1.0, поэтому мой синтаксис может быть неправильным. Я почти уверен, что это будет работать, только если Customer.CustomerId является внешним ключом для Employee.

public class EmployeeMap : ClassMap<Employee>
{
  public EmployeeMap()
  {
    Id(x => x.EmployeeId);
    Map(x => x.EmployeeLogin);

    Table("Customer", m =>
    {
      m.Map(x => x.EmployeeName, "CustomerName");
    });
  }
}
0 голосов
/ 19 мая 2009

EmployeeCustID уникален? Если нет, то это никогда не сработает, так как вы пытаетесь втиснуть два разных типа сущностей в 1. Кроме того, как вы хотите сохранить экземпляр в вашей структуре? -> идентификатор клиента не известен, поэтому вы не можете сохранить такой объект.

ИМХО, лучше просто оставить Customer в качестве связанной сущности для Employee, поскольку (я полагаю) EmployeeCustID используется для привязки сущности Customer к сущности Employee, если сотрудник также является клиентом, что означает, что «customer» является просто роль для работника и, следовательно, необязательная и изменяемая, и поэтому должна быть отдельной организацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...