2009-08-06 26 views
20

cách chúng tôi làm this mapping nhưng lưu loát?Cách tham gia bàn thành thạo nhibernate

<class name="Person" table="People"> 

    <id name="Id"> 
     <generator class="identity"/> 
    </id> 

    <property name="Name" /> 

    <join table="Addresses"> 
     <key column="PersonId"/> 
     <property name="Line1"/> 
     <property name="Line2"/> 
     <property name="City"/> 
     <property name="Country"/> 
     <property name="ZipCode"/> 
    </join> 

</class> 

Tôi biết tôi có thể sử dụng 'Tham khảo' nhưng tôi không cần tất cả các cột từ bảng có liên quan. tôi chỉ cần một tài sản.

Trả lời

24

Điều Paco nói là không đúng. Điều này có thể được thực hiện trong Fluent NHibernate. Tôi đã tự tìm kiếm trên web một thời gian, không thể tìm thấy ai nói về tùy chọn này, vì vậy tôi chỉ chơi đùa với FNHibernate một chút và cuối cùng cũng làm được.

Đây là kịch bản của tôi:

Tôi có hai bảng -

"FormFields" => Columns { "FieldId", "FieldName", "FieldType", "DisplayOrder" } 
"FormStructure" => Columns { "FormId", "FormType", "FieldId" } 

Đây là những thực thể của tôi:

public class FormStructure 
{ 
    public virtual Int32 FormId { get; private set; } 
    public virtual Int32 FormType { get; set; } 
    public virtual FormField FieldId { get; set; } 
} 

public class FormField 
{ 
    public virtual int FieldId { get; private set; } 
    public virtual String FieldName { get; set; } 
    public virtual int? FieldType { get; set; } 
    public virtual int? DisplayOrder { get; set; } 
} 

Tôi có một vài phương pháp trong truy vấn của tôi mà trả về một danh sách của các đối tượng FormStructure. Tôi muốn các phương pháp này đưa cho tôi chúng theo yêu cầu của trường DisplayOrder trong đối tượng FormField và muốn DisplayOrder có sẵn dưới dạng tài sản trong đối tượng FormStructure của tôi vì các lý do khác. Điều này về cơ bản có nghĩa là tôi cần phải tham gia các bảng để tôi có thể lấy tất cả các cột từ bảng FormStructure cùng với cột DisplayOrder từ bảng FormField, tham gia chúng trên các cột FieldId phù hợp.

Tôi đã làm gì để giải quyết này:

  1. Tôi đã thêm một tính chất gọi là DisplayOrder để đối tượng FormStructure tôi.

    public virtual int? DisplayOrder { get; set; } 
    
  2. tôi đã thêm các phương pháp Join để FormStructure lớp bản đồ của tôi vì vậy nó trông như thế này.

    public class FormStructureMap : ClassMap<FormStructure> 
    { 
        public FormStructureMap() 
        { 
         Table("FormStructure"); 
    
         Id(x => x.Id); 
         Map(x => x.FormType); 
         References(x => x.Schedule).Column("ScheduleId"); 
         References(x => x.Field).Column("FieldId"); 
         Map(x => x.IsMandatory).Nullable(); 
    
         Join("FormFields", m => 
         { 
          m.Fetch.Join(); 
          m.KeyColumn("FieldId"); 
          m.Map(t => t.DisplayOrder).Nullable(); 
         }); 
        } 
    } 
    

Phương pháp Join sẽ rõ ràng tham gia giữa hai bảng trên cột bạn đã định nghĩa trong phương pháp KeyColumn trong tham gia.

Điều này cũng sẽ xóa một số hàng có giá trị null. Để tránh điều này (tôi đã gặp phải điều này gần đây), bạn có thể thêm m.Optional(); bên trong phương thức Join.

tôi bây giờ có thể lấy một danh sách các FormStructure đối tượng, ra lệnh cho họ bởi DisplayOrder và thậm chí có DisplayOrder có sẵn như là một tài sản trong đối tượng FormStructure.

Điều này không thể thực hiện được trước đây, vì nó sẽ không nhận ra cột DisplayOrder trong mệnh đề Đơn hàng tôi có ở đó.

+0

Thú vị, tuy nhiên, tài liệu về phương thức Join() với ánh xạ lớp con cho đối số Hành động thứ 2 Tham gia() -> "điều này chỉ hoạt động nếu bạn đang ở trong chiến lược phân cấp bảng mỗi lần thừa kế. – PandaWood

0

Theo như tôi biết, điều này không được hỗ trợ trong Fluent NHibernate, giống như nhiều ánh xạ cụ thể khác của cơ sở dữ liệu kế thừa. Tôi e rằng bạn phải chuyển về hbm.xml hoặc trộn các bản đồ thông thạo với hbm.xml

+0

Tôi vừa gặp phải cùng một vấn đề chính xác. Tôi đã ánh xạ tất cả các bảng của tôi thành thạo và tôi chỉ cần thêm một cột trong một liên kết, như được hiển thị trong liên kết. Làm cách nào để tôi có thể kết hợp ánh xạ thông thạo của tôi với tính năng bổ sung này trong ánh xạ xml? – gillyb

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