2012-01-30 12 views
5

Tôi đang sử dụng cơ sở dữ liệu mẫu Northwind. Tôi có mã này:Khuôn khổ thực thể Cascading Deletes & Lazy Loading

var db = new NorthwindEntities(); 
int id = 2; // Example 
var delObject = (from o in db.Orders.Include("Order_Details") 
       where o.OrderID == id 
       select o).First(); 
db.Orders.DeleteObject(delObject); 
db.SaveChanges(); 
  • Tôi có một (1-to-many) gắn trong thứ tự - Order Details, với tầng xóa. (Nếu tôi xóa một Đơn đặt hàng, tất cả Order_Details có cùng OrderID sẽ bị xóa).

  • Tôi có LazyLoading bật.

Nếu tôi xóa .Include("Order_Details") trong điều khoản từ, việc xóa tầng sẽ không hoạt động.

Tại sao điều này lại xảy ra? Không phải là khởi tạo lười biếng phải "bao gồm" các Order_Details cho tôi, và cuối cùng cho tôi thác xóa?

+0

Không. Theo kinh nghiệm của tôi, việc xóa tầng chỉ áp dụng cho các đối tượng bộ nhớ. – cadrell0

Trả lời

5

Việc xóa tầng được xác định trong mô hình EF của bạn.

EF do đó sẽ tạo báo cáo xóa cho dữ liệu mà nó đã tải. EF sẽ không đi đến cơ sở dữ liệu để kiểm tra những gì nó cần xóa.

Bạn có thể xác định xóa tầng (tùy thuộc vào cơ sở dữ liệu của bạn) ở cấp cơ sở dữ liệu. Trong trường hợp này EF sẽ xóa nút trên cùng và cơ sở dữ liệu sẽ xóa các hàng liên quan.

1

Bạn có xóa tầng được xác định trong cả cơ sở dữ liệu và cấu hình tổ chức? Tôi đã nhìn thấy nơi có nó được xác định trong chỉ có một và không phải là khác có thể gây ra vấn đề này.

+0

Thật vậy, điều đó làm cho nó hoạt động, nhưng tại sao điều này lại xảy ra? – ColdFusion

1

Xóa tầng trong mô hình EF chỉ xóa các chi tiết đã được tải trong ngữ cảnh. Trong trường hợp nếu bạn sử dụng Include Order_Details được tải trong quá trình truy vấn cùng với Lệnh. Nếu bạn đã bật LazyLoading và không sử dụng Bao gồm thì chúng được tải khi cần thiết, tức là khi bạn tham chiếu thuộc tính điều hướng. Vì vậy nếu bạn không quan tâm đến chi tiết và đồng ý rằng chúng sẽ bị xóa âm thầm với bản ghi chính, bạn phải xác định xóa tầng trong cả mô hình EF và lược đồ DB.