12

Tôi đang sử dụng EF 4 STE để mô hình hóa đối tượng Đính kèm. Đính kèm chứa Tên, Mô tả, Ngày và quan trọng nhất là Dữ liệu (byte[]). Để tối ưu hóa tải, tôi không muốn truy xuất thuộc tính Dữ liệu cho đến khi nó hoàn toàn cần thiết, tức là khi người dùng nhấp vào Download từ khách hàng.Bảng phân tách khung thực thể Xóa

Để thực hiện theo phương pháp này, tôi đã sử dụng kỹ thuật tách bảng được mô tả here. Tôi chia tờ Đính kèm của bạn lên thành Tài liệu đính kèm (Tên, Mô tả, Ngày) và Đính kèmData (Dữ liệu). Đó là mối quan hệ 1-1 giữa mẫu EF của tôi. Mọi thứ hoạt động tốt cho đến khi tôi cố xóa một tệp đính kèm mà không cần Tệp đính kèmData (ví dụ: attachment.AttachmentData == null). Tôi nhận được ngoại lệ sau:

Gặp phải dữ liệu không hợp lệ. Mối quan hệ bắt buộc bị thiếu. Kiểm tra StateEntries để xác định nguồn gốc của vi phạm ràng buộc.

Tôi đã thấy similar post, nhưng dường như tôi không thể làm việc này với phương pháp mở rộng của STE và phương thức mở rộng ApplyChanges.

Ngay bây giờ mã truy cập dữ liệu của tôi rất đơn giản: Tôi gọi ngữ cảnh là ApplyChanges() theo sau là SaveChanges().

Tôi đã thử một hàm SQL đơn giản xóa và ánh xạ nó tới cả hai thực thể và thực tế đã làm việc; tuy nhiên nó đã phá vỡ chèn. Tôi dường như không thể ánh xạ một hàm chèn cho tất cả các thuộc tính cho cả hai thực thể.

Bất kỳ ý tưởng nào về một số tùy chọn khác mà tôi có thể thử? Có thể tùy chọn mối quan hệ giữa Đính kèm và Tệp đính kèm không? Khi tôi tạo từ 1 đến 0+, tôi nhận được lỗi ánh xạ nói rằng Their primary keys may collide.

Mở cho mọi đề xuất.

Cảm ơn!

Trả lời

6

Giải pháp là tương tự như câu hỏi liên quan nhưng bạn phải sử dụng tính năng cụ thể của STES - ApplyChanges:

context.Attachments.ApplyChanges(att); 
if (context.ObjectStateManager.GetObjectStateEntry(att).State == EntityState.Deleted) 
{ 
    var data = new AttachmentData() {Id = att.Id}; 
    context.AttachmentDataSet.Attach(data); 
    context.AttachmentDataSet.DeleteObject(data); 
} 
context.SaveChanges(); 
+0

Cảm ơn bó cho các phản ứng! Hoạt động tuyệt vời! –

+0

Đây là điều khiến tôi bối rối: tại sao EF không thể nhận ra rằng, vì các thực thể được lưu trữ trong cùng một bảng, việc xóa một trong số chúng cũng sẽ xóa bỏ cái kia? Tại sao bạn cần tải nó? –

+1

@FyodorSoikin: Tôi đoán vì chưa có ai thực hiện tính năng đó. –

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