Chúng tôi đang sử dụng Mã khung thực thể đầu tiên với các mối quan hệ khóa ngoại. Chúng tôi nghiên cứu cách xử lý việc xóa các đối tượng khỏi một đối tượng ICollection trong ứng dụng của chúng tôi.Có thể xóa con khỏi bộ sưu tập và giải quyết các sự cố trên SaveChang không?
Khi chúng tôi có một thực thể có mối quan hệ trẻ em, chúng tôi có thể thêm các đối tượng trực tiếp vào ICollection của họ bằng cách sử dụng phương thức Thêm. Bây giờ khi bạn sử dụng loại bỏ bạn nhận được lỗi
System.InvalidOperationException xảy ra tin nhắn = Các hoạt động thất bại: Mối quan hệ không thể được thay đổi bởi vì một hoặc nhiều các thuộc tính khóa ngoài là không nullable. Khi thay đổi được thực hiện cho mối quan hệ , thuộc tính khóa ngoài có liên quan được đặt thành giá trị null. Nếu khóa ngoài không hỗ trợ giá trị null, mối quan hệ mới phải được xác định, thuộc tính khóa ngoài phải được gán giá trị không null khác hoặc đối tượng không liên quan phải bị xóa.
Tôi hiểu điều này là vì Xóa trên bộ sưu tập chỉ xóa mối quan hệ bằng cách vô hiệu hóa khóa ngoại. Chúng tôi muốn viết logic kinh doanh của chúng tôi trong thực thể của chúng tôi và cho phép loại bỏ.
Vì vậy, hãy lấy thực thể gốc ra khỏi Repostiory của nó, ví dụ: Order từ OrderRepository sau đó gọi một số phương pháp cụ thể của thực thể, ví dụ: Order.AddOrderline(Orderline orderline)
Điều này thêm Dòng đơn hàng vào Đơn đặt hàng virtual ICollection<OrderLine> OrderLines
Tuy nhiên, chúng tôi không thể viết mã như Order.CancelOrderline(int orderLineId)
vì chỉ cần xóa khỏi ICollection gây ra lỗi về thay đổi tiết kiệm.
Dường như không có cách nào để đạt được điều này bằng cách thao tác các bộ sưu tập đối tượng. Rõ ràng chúng ta có thể loại bỏ trực tiếp từ Context. Tuy nhiên tôi muốn biến nó thành một phần của thực thể. Chúng ta có thể dọn dẹp một số thực thể không có khoá ngoại trên sự kiện SaveChanges của Entity Framework không? Rõ ràng là cần phải nói cho EF biết những thực thể nào có thể được gỡ bỏ nếu chúng có khóa ngoài rỗng.
Hiện tại chúng tôi đang sử dụng mẫu lưu trữ để trình điều khiển không có quyền truy cập vào ngữ cảnh. Tôi rõ ràng có thể sử dụng một kho lưu trữ OrderLine hoặc loại bỏ một phương thức OrderLine trên kho lưu trữ Order. Tuy nhiên chỉ cần tự hỏi nếu nó có thể viết mã trên thực thể mà không có tham chiếu đến cơ chế kiên trì.
Suy nghĩ? Chúng ta đang đi về điều này tất cả sai? Các ORM khác có cho phép bạn xóa khỏi Bộ sưu tập con không?
Vì vậy, nếu tôi tạo khóa tổng hợp trên các thực thể con, EF sẽ giải quyết vấn đề này cho tôi. Bây giờ có vẻ khá hấp dẫn. – GraemeMiller
Điều đó thật tuyệt vời nhưng tôi cần thêm [Key, Column (Order = 0), DatabaseGenerated (DatabaseGeneratedOption.Identity)] int công khai OrderLineId {get; bộ; } để làm cho nó không phàn nàn về chèn danh tính. – GraemeMiller
@GraemeMiller: Đó là ý của tôi với "* Bạn có thể đặt OrderLineId thành nhận dạng tự động nếu bạn muốn *" :) Tôi quên đề cập rằng bạn cần thực hiện việc này trong mô hình * (với DatabaseGeneratedOption) * và * trong kho dữ liệu*. – Slauma