2010-03-05 41 views
6

Kịch bản là như sau,nhibernate không thác xóa trẻ em

Tôi có 3 đối tượng (i đơn giản hóa tên) có tên phụ huynh, con mẹ của đứa trẻ & của con
con của cha mẹ là một tập hợp trong phụ huynh, và Đứa trẻ của đứa trẻ là một đứa trẻ.

lập bản đồ là như sau (phần liên quan)

mẹ

<set name="parentset" 
    table="pc-table" 
    lazy="false" 
    fetch="subselect" 
    cascade="all-delete-orphan" 
    inverse="true"> 
    <key column=FK_ID_PC" on-delete="cascade"/> 
    <one-to-many class="parentchild,parentchild-ns"/> 
</set> 

con của cha mẹ

<set name="childset" 
    table="cc-table" 
    lazy="false" 
    fetch="subselect" 
    cascade="all-delete-orphan" 
    inverse="true"> 
    <key column="FK_ID_CC" on-delete="cascade"/> 
    <one-to-many class="childschild,childschild-ns"/> 
</set> 

gì tôi muốn đạt được là khi tôi xóa các phụ huynh, sẽ có một cascade xóa tất cả các cách máng cho con của trẻ. Nhưng những gì hiện đang xảy ra là điều này.

(điều này là hoàn toàn cho mục đích thử nghiệm lập bản đồ) nhận được một công ty mẹ (hoạt động tốt)

IQuery query = session.CreateQuery("from Parent where ID =" + ID); 
IParent doc = query.UniqueResult<Parent>(); 

nay là phần xóa

session.Delete(doc); 
transaction.Commit(); 

Sau khi giải quyết 'không thể chèn giá trị null' lỗi với cascading và nghịch đảo tôi hy vọng điều này bây giờ sẽ xóa tất cả mọi thứ với mã này, nhưng chỉ có cha mẹ đang bị xóa.

Tôi đã bỏ lỡ điều gì đó trong bản đồ của tôi có khả năng bị bỏ qua? Bất kỳ gợi ý nào đúng hướng đều được chào đón nhiều hơn!


Diego, cảm ơn bạn đã trả lời điểm. (và giải thích)

Tôi đã loại bỏ on-delete="cascade", điều này bởi vì tôi thích kiểm soát nhiều nhất có thể trong mã và không có trong cơ sở dữ liệu.

Mã được đăng bên dưới là kết quả (hoạt động).

mẹ con

<set name="parentset"  
    table="pc-table"  
    cascade="all-delete-orphan"  
    inverse="true" 
    batch-size="5">  
    <key column=FK_ID_PC"/>  
    <one-to-many class="parentchild,parentchild-ns"/>  
</set> 

mẹ của

<set name="childset"    
    table="cc-table"  
    cascade="all-delete-orphan" 
    batch-size="5" 
    inverse="true">    
    <key column="FK_ID_CC">    
    <one-to-many class="childschild,childschild-ns"/>    
</set> 

Hope this helps những người có cùng một vấn đề!

Trả lời

6

Bằng cách đặt on-delete="cascade" trên các phím, bạn cho phép DB xử lý tầng.

Bạn có đang tạo lược đồ của mình bằng NHibernate không?

Tôi vừa sao chép ví dụ của bạn và nó hoạt động tốt khi có và không có thuộc tính đó. Khi loại bỏ nó, NHibernate hiện các tầng.

BTW, sử dụng lazy="false" fetch="subselect" không phải là điều bạn nên làm theo mặc định. Nếu bạn xóa các thuộc tính đó, hãy để on-delete="cascade" và thay đổi cascade thành save-update, bạn sẽ chỉ có hai truy vấn để truy lục và xóa một Phụ huynh.

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