http://weblogs.asp.net/zeeshanhirani/archive/2010/07/23/removing-entity-from-a-related-collection.aspx giải thích chính xác những gì đã xảy ra với bạn.
Giả sử bạn có một cái gì đó thiết kế lớp như thế này:
Entity Framework sẽ tạo ra các cột chính nước ngoài theo yêu cầu và thêm NOT NULL
trở ngại đối với họ bởi vì tất cả các thức nấu ăn sẽ luôn luôn được gắn liền với chính xác một ControlUnit.
Vì vậy, khi chạy bạn sẽ có các đối tượng tương tự như cách bố trí như sau:
Bây giờ mã của bạn đến chơi và xóa các mối quan hệ giữa Recipe đối tượng và ControlUnit của họ:
Đang cố gắng lưu tại thời điểm này, cơ sở dữ liệu không có ID ControlUnit để đưa vào khóa ngoài NOT NULL
cột. Trạng thái đối tượng hiện tại vi phạm sơ đồ lớp ở trên và không thể được lưu vào bố cục cơ sở dữ liệu đã được tạo theo giả định rằng mọi Công thức đều được liên kết với một ControlUnit. Đây là lý do tại sao cơ sở dữ liệu từ chối lưu các thay đổi và bạn thấy ngoại lệ.
Điều này cũng giải thích lý do tại sao nó hoạt động khi bạn bỏ ghi chú dòng xóa thực thể: Thực thể được loại bỏ khỏi cơ sở dữ liệu cùng với mối quan hệ của nó, do đó không có ràng buộc nào bị vi phạm.
"Nhưng tôi đặt ON DELETE CASCADE
về mối quan hệ ..."
Vâng, nhưng điều đó chỉ được kích hoạt trên việc xóa đối tượng, không phải trên xóa của mối quan hệ.Với ON DELETE CASCADE
bộ, điều này sẽ làm việc:
controlUnitRepository.DeleteObject(_controlUnit);
// deletes the ControlUnit and all associated Recipe entities
Nếu bạn muốn kích hoạt xoá các đối tượng Recipe về xóa mối quan hệ của họ với ControlUnit, mối quan hệ của bạn không phải là một hiệp hội đơn giản mà là một thành phần:
EF không hỗ trợ điều này nguyên bản, nhưng bạn có thể mô phỏng hành vi bằng cách sử dụng các mối quan hệ xác định. Khi thực thể nằm trong mối quan hệ xác định với thực thể cha và mối quan hệ đó bị xóa, thực thể cũng sẽ bị xóa. Có vẻ như đây là ý định của bạn ngay từ đầu. Để biết thêm thông tin về việc xác định mối quan hệ, hãy xem Implementing identifying relationships with EF4 nơi tôi đã triển khai các mối quan hệ xác định với EF4 và đã liên kết với nhiều tài liệu đọc hơn.
tôi đã cùng một vấn đề ngày hôm nay và tôi tin rằng đây là một lỗ hổng thiết kế trong Entity Framework. Mối quan hệ giữa các bảng trong SQL Server nói "Cascade delete orphans" và do đó sẽ hoạt động. Nó hoạt động như thế trong NHibernate. May mắn là bạn có thể làm cho nó hoạt động sau câu trả lời của GraemeMiller và các câu hỏi liên quan. –