2010-06-16 23 views
9

Tôi có một thiết lập lớp đó trông giống như sau:NHibernate Nhiều-To-One trên Subclass Tham gia với Bộ lọc

public abstract class Parent 
{ 
    public virtual bool IsDeleted { get; set; } 
} 

public class Child : Parent 
{ 
} 

public class Other 
{ 
    public virtual ICollection<Child> Children { get; set; } 
} 

trẻ em là ánh xạ như một gia-lớp con của phụ huynh. Childen được ánh xạ dưới dạng túi Nhiều người. Túi có bộ lọc được áp dụng cho nó có tên là SoftDeletableFilter. Ánh xạ bộ lọc trông giống như:

<filter-def name="SoftDeleteableFilter" condition="(IsDeleted = 0 or IsDeleted is null)" /> 

Vấn đề đó là khi Other.Children được tải bộ lọc đang được áp dụng cho bảng con chứ không phải bảng cha. Có cách nào để nói với NHibernate để áp dụng bộ lọc cho lớp cha mẹ?

Edit: Dưới đây là các bản đồ mẹ:

<class name="Parent"> 
    <id .. 
    <property name="IsDeleted" type="System.Boolean"> 
    <column name="IsDeleted" /> 
    </property> 
    <joined-subclass name="Child"> 
    <key> 
     <column name="ParentId" /> 
    </key> 
    ... 
    </joined-subclass> 
</class> 
+0

Ran vào cùng một vấn đề ngày hôm nay. Bao giờ tìm thấy một giải pháp? – Joel

Trả lời

0

bạn cần phải thêm các bộ lọc cho tầng lớp phụ huynh:

<class name="Parent"> 
    <id .. 
    <property name="IsDeleted" type="System.Boolean"> 
    <column name="IsDeleted" /> 
    </property> 
    <joined-subclass name="Child"> 
    <key> 
     <column name="ParentId" /> 
    </key> 
    **<filter-def name="SoftDeleteableFilter" condition="(IsDeleted = 0 or IsDeleted is null)" />** 
    </joined-subclass> 
    **<filter-def name="SoftDeleteableFilter" condition="(IsDeleted = 0 or IsDeleted is null)" />** 
</class> 
+0

Điều này không giải quyết được vấn đề. Nếu tôi truy vấn các lớp cha đã xóa mục sẽ được lọc, nhưng nếu tôi tham gia một túi đến lớp trẻ em, chúng sẽ không được lọc. – Joel

+0

Tôi đã thêm bộ lọc trong lớp con đã tham gia, bạn có thể kiểm tra xem nó có phù hợp với bạn không? Tài liệu nhibernate đưa ra một ví dụ như thế cho các bộ. – Peter

+0

'filter-def' không phải là phần tử con hợp lệ của lớp con đã tham gia. – Joel

1

Cuối cùng tìm thấy một câu trả lời cho điều này. Có lẽ không phải là hiệu quả nhất cách tiếp cận thân thiện, nhưng bạn có thể viết lại điều kiện lọc của bạn như một subquery:

ParentId in (Select p.ParentId from Parent p where p.IsDeleted = false) 

Nhờ CSharper qua at the usergroup cho đề nghị

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