2009-05-19 9 views
9

tengo una estructura de tabla algo como estoFluido NHibernate - Mapa 2 mesas a una clase

table Employees 
EmployeeID 
EmployeeLogin 
EmployeeCustID 

table Customers 
CustomerID 
CustomerName 

lo que me gustaría es mapear la estructura anterior a una sola clase llamada:

Class Employee 
EmployeeID 
EmployeeLogin 
EmployeeName 

¿Cómo hago eso con nhibernate fluido?

Respuesta

4

No sé si es posible con fluidez, pero en XML se utiliza el elemento de unirse a:

simplificado:

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

    <property name="CustomerName"/> 

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

</class> 

Ver este post by Ayende

+0

Hola, tienes razón, podrías hacerlo en la Tabla de clientes, pero me gustaría hacerlo al revés. El uso de la tabla Empleados y unirse a la tabla Clientes en sin embargo resulta en que es imposible unirse a la identificación correcta porque la tabla clientes no tiene la clave externa. –

+0

¿Por qué le gustaría hacerlo diferente? ¿Importa? Es solo así en el mapeo. Usted no ve esto en las clases ni en las tablas. ¿Y qué? –

+6

En Fluent usaría WithTable ("2ndTableName", m => {/ * 2da tabla asignaciones * /); –

0

¿Es EmployeeCustID único? Si no, esto nunca va a funcionar, ya que luego intentará agrupar dos tipos de entidades diferentes en 1. Además, con su estructura, ¿cómo desea guardar una instancia? -> CustomerID no se conoce, por lo que no puede guardar dicha entidad.

En mi humilde opinión, es mejor simplemente mantener al Cliente como una entidad relacionada con el Empleado, ya que (supongo) el EmployeeCustID se usa para vincular una entidad de Cliente con una entidad de Empleado si el empleado también es un cliente, lo que significa 'cliente' solo un rol para el empleado y, por lo tanto, opcional y modificable, y por lo tanto debe ser una entidad separada.

1

no he probado esto desde Fluent NHibernate pasó a 1.0, por lo que mi sintaxis puede ser incorrecta. Estoy bastante seguro de que esto solo funcionará si Customer.CustomerId es una clave externa al 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

Acabo de leer otro comentario que dice que no es cliente de FK para el empleado, por lo que probablemente no funcione. – ddc0660

3

Estoy de acuerdo con Frans anteriores, pero si usted está atascado con el código de otra persona y tienen que utilizar la estructura existente, se puede utilizar puede 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: Esto no funcionaría. Intentaría unir 'Employees.EmployeeId' con' Customers.EmployeeCustID', en lugar de 'Employees.EmployeeCustID' con' Customers.CustomerId' ... –

Cuestiones relacionadas