2013-05-30 22 views
5

Tôi có một tình huống tương tự như mô tả trong Fluent NHibernate Mapping not on PK Fieldthành thạo NHibernate lập bản đồ trên nhiều lĩnh vực phi PK

Tuy nhiên, mối quan hệ giữa các bảng của tôi được mô tả theo nhiều cột chính phi chính. Hãy tưởng tượng tình huống Chris Meek nhưng nơi một PersonJobTypeCode rằng, cùng nhau, nên (xin lỗi, đó là một cơ sở dữ liệu di sản) duy nhất mô tả một Person

Person 
------ 
Id PK 
JobType 
Code 
Name 

Order 
----- 
Id PK 
Person_JobType 
Person_Code 
OrderDetails 

Serhat Özgel của answer mô tả sử dụng PropertyRef, nhưng tôi không thể tìm cách để làm điều đó riêng lẻ cho nhiều cột. Tôi đã thử tương tự như

class PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
     HasMany(p => p.Order) 
      .KeyColumns.Add("Person_JobType") 
      .PropertyRef("JobType") 
      .KeyColumns.Add("Person_Code") 
      .PropertyRef("Code") 
    } 
} 

Nhưng điều này rõ ràng là không làm việc, kể từ KeyColumns.Add() lợi nhuận khác OneToManyPart nên PropertyRef() không được chạy chống lại cột cá nhân được bổ sung. Thứ hai PropertyRef() chỉ đơn giản là ghi đè người đầu tiên, và tôi nhận được lỗi sau:

NHibernate.MappingException : collection foreign key mapping 
has wrong number of columns: MyApp.Person.Order type: Int32 

Tôi đã nhìn vào quá tải hình KeyColumns.Add(),

public TParent Add(string name) 
public TParent Add(params string[] names) 
public TParent Add(string columnName, Action<ColumnPart> customColumnMapping) 
public TParent Add(ColumnMapping column) 

Cụ thể, cuối cùng hai, nhưng không thể tìm thấy bất kỳ cách nào để đặt PropertyRef từng cấp riêng lẻ cho mỗi cột: ( Có cách nào để làm điều đó không? Tôi có làm theo cách này không chính xác không?

Trả lời

3

sử dụng hbm.xml và FluentNHibernate có thể với tại rick

class PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
     Map(_ => JobTypeAndCode) 
      .Columns.Add("Person_JobType", "Person_Code") 
      .ReadOnly() 
      .LazyLoad() // optional: prevent loading the Columns twice 
      .Access.None(); 

     HasMany(p => p.Orders) 
      .KeyColumns.Add("Person_JobType", "Person_Code") 
      .PropertyRef("JobTypeAndCode") 
    } 

    private object JobTypeAndCode { get; set; } // FakeProperty 
} 

Lưu ý: tôi không bao giờ nhận được điều này để làm việc sử dụng NHibernate MappingByCode

+0

Wow, đẹp. Những gì tôi đã kết thúc làm cho điều này đã không có một ánh xạ NHibernate giữa các lớp này, và chỉ cần giải nén các giá trị và ném chúng trở lại kho lưu trữ của lớp khác để có được các bản ghi thích hợp khi cần thiết - thay vì xấu xí. Tôi muốn tôi biết thủ thuật của bạn tuần trước :) –

+0

Đây là lỗi tôi nhận được khi thử phương pháp này (không thể vượt qua nó): bất kỳ ánh xạ nào có thể không tạo thành một phần của thuộc tính – dreamerkumar

+0

@VishalKumar hỏi tốt hơn và đăng một số câu hỏi mã? Có vẻ như tài sản cho propertyref là một tham chiếuBất kỳ thay vì Bản đồ – Firo