9

Tôi có một dự án bằng cách thực hiện NHibernate và sử dụng Tải Lười. Tôi có hai lớp trong dự án này: Người và Gia đình. Quan hệ giữa hai yếu tố đó là tổng hợp, có nghĩa là một người có danh sách Người. Bản đồ là:Lỗi trong Cascade: đối tượng đã xóa sẽ được lưu lại bởi thác

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

    <id name="Id" type="Int64" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 

    <bag name="Families" inverse="true" table="Person_Family" cascade="all-delete-orphan" > 
     <key column="Person_id_fk"/> 
     <one-to-many class="Domain.Entities.Family,Domain.Entities"/> 
    </bag> 

    </class> 

Trong dự án này, tôi Nhận một người bằng ID sau đó xóa một họ gia đình.

Person person = SessionInstance.Get<Person>(id); 
foreach (Family fam in person.Families) 
    if (fam.Name == "Jaun") 
     SessionInstance.Delete(fam); 

Gia đình không bị xóa, Bởi vì ném một ngoại lệ bởi thông điệp này: deleted object would be re-saved by cascade (remove deleted object from associations)[Domain.Entities.Family#167]

Làm thế nào tôi có thể xóa một gia đình người?

Trả lời

13

Về cơ bản những gì NHibernate đang khiếu nại là bạn đang rõ ràng yêu cầu xóa hồ sơ cho Gia đình, khi bạn lưu lại Person the Family sẽ được đặt trở lại đúng chỗ, vì Người vẫn có tham chiếu cho nó trong danh sách các Gia đình.

Thay vào đó, NHibernate đang nói cho bạn để đối phó với mối quan hệ này theo cách hướng đối tượng NHibernate cho phép bạn sử dụng. Đơn giản chỉ cần loại bỏ các tham chiếu đến gia đình "Jaun" từ danh sách Person.Families, sau đó vẫn tồn tại Person. Khi bạn làm điều này, NHibernate sẽ loại bỏ mối quan hệ giữa Gia đình đó và Người đó. Nếu gia đình bây giờ không còn được tham chiếu bởi bất kỳ điều gì khác, vì bạn đã đặt thuộc tính Cascade thành "all-delete-orphan", bản ghi gia đình "Jaun" sẽ bị xóa hoàn toàn khỏi DB.

+2

'person.Families.Remove (fam); SessionInstance.Save (người); ' –

+0

@Cole W: Chính xác. – KeithS

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