2010-10-04 35 views
11

Tôi đang cố gắng tìm ra lý do tại sao NHibernate xử lý xếp chồng một đến nhiều (sử dụng thác = all-delete-orphan) theo cách của nó. Tôi chạy vào cùng một vấn đề như anh chàng này:Tại sao không NHibernate xóa trẻ mồ côi đầu tiên?

Forcing NHibernate to cascade delete before inserts

Theo như tôi có thể nói với NHibernate luôn thực hiện chèn trước, sau đó cập nhật, sau đó xóa. Có thể có một lý do rất tốt cho điều này, nhưng tôi không thể cho cuộc sống của tôi tìm ra lý do đó là gì. Tôi hy vọng rằng một sự hiểu biết tốt hơn về điều này sẽ giúp tôi đưa ra một giải pháp mà tôi không ghét :)

Có lý thuyết nào tốt về hành vi này không? Trong trường hợp nào thì việc xóa trẻ mồ côi đầu tiên sẽ không hoạt động? Tất cả các ORM có hoạt động theo cách này không?

+1

Chỉ muốn thêm sự thất vọng của tôi vào câu hỏi này. NHibernate là một thất bại tuyệt đối trong trường hợp này. Tôi đã chiến đấu cả ngày với vấn đề ngu ngốc này. Ngay cả những ORM cơ bản nhất xử lý điều này nhiều hơn nữa một cách duyên dáng sau đó NHibernate. Tôi đã hoàn toàn mã hóa xung quanh điều này.Bạn và tôi cả hai phải đã bỏ lỡ một cái gì đó. – JasonCoder

Trả lời

2

EDIT: Sau khi nói không có lý do gì, đây là lý do. phép nói rằng bạn có các tình huống sau:

public class Dog { 
    public DogLeg StrongestLeg {get;set;} 
    public IList<DogLeg> Legs {get;set; 
} 

Nếu bạn đã xóa đầu tiên, và cho phép nói rằng bạn xóa tất cả các Dog.Legs, sau đó bạn có thể xóa các StrongestLeg đó sẽ gây ra một sự vi phạm tham khảo. Do đó bạn không thể DELETE trước khi bạn UPDATE.

Cho phép bạn thêm chân mới và chân mới đó cũng là StrongestLeg. Sau đó, bạn phải INSERT trước khi bạn UPDATE để chân có một Id có thể được chèn vào Dog.StrongestLegId.

Vì vậy, bạn phải INSERT, UPDATE, sau đó DELETE.

Cũng như nHibernate dựa trên Hibernate, tôi đã có một cái nhìn vào Hibernate và tìm thấy một số người nói về cùng một vấn đề.

Và đây là câu trả lời tốt nhất từ ​​chúng:

Gail Badner đã thêm nhận xét - 21/Feb/08 2:30 CH: Sự cố phát sinh khi một tổ chức liên kết mới có ID được tạo được thêm vào bộ sưu tập. Bước đầu tiên, khi hợp nhất một thực thể chứa bộ sưu tập này, là thác lưu tổ chức mới pháp nhân. Dòng thác phải xảy ra trước các thay đổi khác đối với bộ sưu tập. Bởi vì khóa duy nhất cho thực thể liên kết mới này giống với một thực thể đã tồn tại, một ConstraintViolationException là được ném. Đây là hành vi mong đợi.

+0

Nó không chỉ là trường hợp này. Về cơ bản, bất kỳ thực thể nào được tham chiếu đều không thể bị xóa cho đến khi nó bị hủy tham chiếu. Bất kỳ thực thể nào tham chiếu đến một thực thể khác không thể được cập nhật cho đến khi thực thể khác được chèn vào. – Iain

+0

Một số RDBMS cho phép trì hoãn kiểm tra ràng buộc cho đến khi kết thúc giao dịch, vì vậy nó không phải là một câu hỏi không hợp lý, và một kịch bản rất hợp lệ và phổ biến. Thông tin thêm http://stackoverflow.com/questions/1330020/is-it-possible-to-defer-referential-integrity-checks-until-the-end-of-a-transact – ironstone13

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