2009-05-19 29 views
9

Tôi có một cái gì đó cấu trúc bảng như thế nàythành thạo NHibernate - Bản đồ 2 bảng để một lớp

table Employees 
EmployeeID 
EmployeeLogin 
EmployeeCustID 

table Customers 
CustomerID 
CustomerName 

gì tôi muốn là để lập bản đồ cấu trúc trên một lớp duy nhất có tên:

Class Employee 
EmployeeID 
EmployeeLogin 
EmployeeName 

Làm thế nào để tôi làm điều đó với nhibernate thông thạo?

Trả lời

4

Tôi không biết nếu nó là có thể với thông thạo, nhưng trong xml bạn sử dụng tham gia tố:

đơn giản:

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

    <property name="CustomerName"/> 

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

</class> 

Xem này post by Ayende

+0

Xin chào, bạn đúng, bạn có thể tham gia từ Bảng khách hàng, nhưng tôi muốn thực hiện theo cách khác. Sử dụng bảng nhân viên và tham gia bảng khách hàng tuy nhiên kết quả là không thể tham gia vào id chính xác vì bảng khách hàng không có khóa ngoại. –

+0

Tại sao bạn muốn làm điều đó khác? Nó có quan trọng không? Nó chỉ là cách này trong ánh xạ. Bạn không thấy điều này trong các lớp cũng như các bảng. Vậy cái gì? –

+6

Trong Fluent bạn muốn sử dụng WithTable ("2ndTableName", m => {/ * ánh xạ bảng thứ 2 * /); –

0

Có phải EmployeeCustID là duy nhất không? Nếu không, điều này sẽ không bao giờ hoạt động, khi bạn cố gắng nhồi nhét hai loại thực thể khác nhau vào 1. Ngoài ra, với cấu trúc của bạn, bạn muốn lưu một cá thể như thế nào? -> CustomerID không được biết, vì vậy bạn không thể lưu một thực thể như vậy. IM2 tốt hơn là chỉ đơn giản là giữ khách hàng như một thực thể có liên quan cho nhân viên, như (tôi giả định) EmployeeCustID được sử dụng để liên kết thực thể khách hàng với một thực thể nhân viên nếu nhân viên cũng là khách hàng, có nghĩa là 'khách hàng' chỉ là một vai trò cho nhân viên và do đó tùy chọn và có thể thay đổi và do đó phải là một thực thể riêng biệt.

1

Tôi đã không cố gắng này vì Fluent NHibernate đã chuyển sang 1.0 nên cú pháp của tôi có thể không chính xác. Tôi chắc chắn điều này sẽ chỉ hoạt động nếu Customer.CustomerId là khóa ngoại trừ 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

Tôi chỉ đọc một nhận xét khác rằng bạn không phải là Khách hàng của FK đối với nhân viên để điều này có thể không hoạt động. – ddc0660

3

Tôi đồng ý với Frans ở trên nhưng nếu bạn bị mắc kẹt với mã của người khác và phải sử dụng cấu trúc hiện tại, bạn có thể sử dụng 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: Điều này sẽ không hoạt động. Nó sẽ cố gắng tham gia 'Employees.EmployeeId' với' Customers.EmployeeCustID', thay vì 'Employees.EmployeeCustID' bằng' Customers.CustomerId' ... –

Các vấn đề liên quan