Morten Schmidt
Morten Schmidt

Reputation: 642

Fluent NHibernate - Map 2 tables to one class

I have a table structure something like this

table Employees
 EmployeeID
 EmployeeLogin
 EmployeeCustID

table Customers
 CustomerID
 CustomerName

What i would like is to map the structure above to one single class named:

Class Employee
 EmployeeID
 EmployeeLogin
 EmployeeName

How do i do that with fluent nhibernate ?

Upvotes: 9

Views: 9211

Answers (4)

Marius Smit
Marius Smit

Reputation: 39

I agree with Frans above but if you're stuck with someone else's code and have to use the existing structure, you can can use 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; }
}

Upvotes: 3

ddc0660
ddc0660

Reputation: 4052

I have not tried this since Fluent NHibernate went to 1.0 so my syntax may be incorrect. I'm pretty sure this will only work if Customer.CustomerId is a foreign key to 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");
    });
  }
}

Upvotes: 1

Stefan Steinegger
Stefan Steinegger

Reputation: 64628

I don't know if it is possible with fluent, but in xml you use the join element:

simplified:

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

  <property name="CustomerName"/>

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

</class>

See this post by Ayende

Upvotes: 4

Frans Bouma
Frans Bouma

Reputation: 8347

Is EmployeeCustID unique? If not, this is never going to work, as you then try to cram two different entity types into 1. Also, with your structure, how do you want to save an instance? -> the CustomerID isn't known, so you can't save such an entity.

IMHO it's better to simply keep Customer as a related entity to Employee, as (I assume) the EmployeeCustID is used to link a Customer entity to an Employee entity if the employee is also a customer, which means 'customer' is just a role for employee and therefore optional and changeable and thus should be a separate entity.

Upvotes: 0

Related Questions