2009-05-19 1 views
9

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

table Employees 
EmployeeID 
EmployeeLogin 
EmployeeCustID 

table Customers 
CustomerID 
CustomerName 

Что я хотел бы, чтобы отобразить структуру выше для одного класса с именем:

Class Employee 
EmployeeID 
EmployeeLogin 
EmployeeName 

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

ответ

4

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

упрощена:

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

    <property name="CustomerName"/> 

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

</class> 

Смотрите эту post by Ayende

+0

Привет, вы правы, вы можете сделать это, присоединиться к таблице Customers, но я хотел бы сделать это наоборот. Использование таблицы Employees и присоединение к таблице Customers, однако это приводит к невозможности соединения с правильным идентификатором, поскольку таблица клиентов не имеет внешнего ключа. –

+0

Зачем вам это нравится? Это имеет значение? Только так в картировании. Вы не видите это в классах и таблицах. И что? –

+6

В Fluent вы должны использовать WithTable («2ndTableName», m => {/ * отображение двух таблиц * /); –

0

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

IMHO лучше просто держать Клиента в качестве связанного объекта с Employee, поскольку (я полагаю) EmployeeCustID используется для связывания объекта Customer с субъектом Employee, если работник также является клиентом, что означает, что «клиент» является просто роль сотрудника и, следовательно, необязательная и изменчивая и, следовательно, должна быть отдельной сущностью.

1

Я не пробовал это поскольку 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

Я только что прочитал еще один комментарий, что вы не являетесь клиентом FK для сотрудников, поэтому это вряд ли сработает. – ddc0660

3

Я согласен с Frans выше, но если вы застряли с чужим кодом и должны использовать существующую структуру, вы можете можете использовать 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; } 
} 
+2

-1: Это не сработает. Он попытается присоединиться к 'Employees.EmployeeId' с' Customers.EmployeeCustID', а не 'Employees.EmployeeCustID' с' Customers.CustomerId' ... –

 Смежные вопросы

  • Нет связанных вопросов^_^