2008-11-25 37 views
8

Tôi đang cố gắng ánh xạ một kịch bản phân lớp tham gia bằng cách sử dụng Fluent NHibernate. Tôi có một Entity lớp được định nghĩa trong namespace Core, và một lớp con lớp : Entity trong SomeModule namespaceFluent NHibernate, join-subclass mapping

Bây giờ tôi rõ ràng là không muốn lớp Entity biết về nguồn gốc loại của nó, là tài liệu tham khảo SomeModules namespace Core - không phải cách khác xung quanh.

Tất cả các ví dụ tôi đã có thể tìm thấy sử dụng cái gì đó như:

public class EntityMap : ClassMap<Entity> { 
    public EntityMap() { 
     Id(x => x.Id) 

     var subClassMap = JoinedSubClass<SubClass>("SubClassId", sub => sub.Map(x => x.Id)); 

     subClassMap.Map(x => x.SomeProperty) 
     ... 
    } 
} 

này chỉ đơn giản là sẽ không làm việc trong hoàn cảnh của tôi - Tôi cần một cái gì đó giống như các bản đồ NHibernate xml:

<joined-subclass name="SubClass" extends="Entity, Core" > 
<key column="SubClassId" foreign-key="FK_KollegiumEntity"/> 
<property name="Name" length="255" not-null="true" /> 
... 
</joined-subclass> 

Có ai đạt được điều này với Fluent NHibernate không?

Trả lời

0

Xin chào một số điều như nó cách đây vài ngày.

public class EntityMap : ClassMap<Entity> { 
public EntityMap() { 
    Id(x => x.Id) 

    JoinedSubClass<SubClass>("SubClassId", sub => { 
      sub.Map(x => x.Name); 
      sub.Map(x => x.SomeProperty); 
    }); 
} 
} 

Hy vọng nó giúp

+1

Giải pháp được đề xuất của bạn không giải quyết được sự cố của tôi, đó là tách các ánh xạ của Thực thể và SubClass. –

0

Magnus, tôi đã có loại chính xác cùng một vấn đề, và đề nghị của bạn sắp xếp nó.

Tham số thứ hai để JoinSubClass thực hiện Hành động SubClassPart đối với đối tượng loại SubT của bạn. Do đó bạn chỉ cần ánh xạ các trường bổ sung trên đối tượng được phân lớp của bạn.

Ví dụ trước đó là ánh xạ một Id, vì vậy tôi đoán đó là một id khác với giá trị cơ sở và phân lớp tham gia, nếu không bạn sẽ bắt đầu thấy lỗi SqlParameterCollection được thông qua.

1

Xin lỗi bỏ lỡ nhận xét của bạn, thấy điều này

public class SubClassMap : JoinedSubClassPart<SubClass> 
{ 
    public SubClassMap() 
     : base("SubClassId") 
    { 
     Map(x => x.Name); 
     Map(x => x.SomeProperty); 
    } 
} 

Hy vọng nó sẽ giúp nếu bạn chưa giải quyết nó rồi.

1

Magnus (hoặc giải thưởng),

Bạn đã tìm ra cách sử dụng ví dụ cuối cùng trong lớp ánh xạ chính? Điều này làm việc cho tôi, nhưng tôi không thích instantiating SubClassMap bản thân mình:

public class EntityMap : ClassMap<Entity> { 
public EntityMap() { 
    Id(x => x.Id) 
    AddPart(new SubClassMap()); // Adds the subclass mapping! 
} 
} 

public class SubClassMap : JoinedSubClassPart<SubClass> 
{ 
    public SubClassMap() 
     : base("SubClassId") 
    { 
     Map(x => x.Name); 
     Map(x => x.SomeProperty); 
    } 
} 

nào tạo ra một truy vấn tương tự như:

SELECT 
    this_.Id as Id2_2 
    this_.Name as Name3_2 
    this_.SomeProperty as SomeProperty3_2 
FROM 
    SubClass this_ inner join 
    Entity this_1 on this_.Id=this_1.Id 
+4

Có vẻ Thêm Phần bây giờ đã lỗi thời ...? – 5x1llz

10

Tôi nghĩ rằng API đã thay đổi kể từ khi câu hỏi này được hỏi, nhưng điều này làm việc cho tôi:

public class SomeSubclassMap : SubclassMap<SomeSubclass> { 
    public SomeSubclassMap() 
    { 
     KeyColumn("SomeKeyColumnID"); 
     Map(x => x.SomeSubClassProperty); 
     ... 
    } 
} 

tôi tin KeyColumn chỉ được yêu cầu nếu nó khác với 'Baseclassname_id'

Lưu ý: Cũng cần có một ClassMap<SomeBaseClass> cho lớp cơ sở mà SomeSubClass mở rộng.

+0

+1 cho câu trả lời hay của bạn.Bạn có bất kỳ ý tưởng làm thế nào để nói Fluent NHibernate rằng "KeyColumn" nên được tham gia vào cột "XYZ" trong bảng lớp cơ sở, không phải là cột khóa chính? –

+0

@Milan: Tôi chỉ thấy điều này, xin lỗi vì trả lời chậm. Tôi không biết một cách để chỉ định một KeyColumn khác nhau trên thuộc tính lớp -KeyColumn của lớp cơ sở có nghĩa là, cột khóa chính của cha/gốc. Tôi đã nhìn vào các tài liệu chỉ trong trường hợp có điều gì đó tôi có thể đã hiểu lầm. –

+0

@MilanGardian bạn đã bao giờ tìm thấy câu trả lời cho câu hỏi của mình chưa? Một lớp con có thể ánh xạ trở lại cha mẹ của nó không, nhưng w/o bằng cách sử dụng cột ID của cha mẹ? – ahsteele

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