2009-06-01 22 views
26

Có ai biết cách xóa một đối tượng và tất cả các thực thể liên quan bên trong EF mà không cần di chuyển qua đồ thị đối tượng và xóa từng đối tượng không? Ví dụ: Tôi có SalesOrder và SalesOrderDetails với mối quan hệ 1: N giữa chúng. Khi tôi xóa một SalesOrder, tôi muốn tất cả các OrderOrderDetails được xóa tự động.Xóa một đối tượng và tất cả các thực thể liên quan của nó trong Entity Framework

Điều này có thể thực hiện được trong EF không?

Trả lời

26

Bạn không nên thực hiện việc này trong Khuôn khổ thực thể. Tất cả các cơ sở dữ liệu quan hệ phổ biến đều hỗ trợ ON CASCADE DELETE trên các khóa ngoài có hiệu quả hơn rất nhiều. Tôi đề nghị bạn chỉ cần đi với điều đó.

+7

Yeap. Nếu bạn xóa bỏ các mối quan hệ của bạn trong cơ sở dữ liệu, và bạn đưa nó vào một mô hình EF, EF sẽ xóa các thực thể phụ thuộc vào bộ nhớ để cố giữ biểu đồ đối tượng bộ nhớ đồng bộ với cơ sở dữ liệu. Nhưng bạn không nên dựa vào EF xóa tất cả các đối tượng liên quan, đó là công việc của cơ sở dữ liệu. –

+2

Cảm ơn Alex, tôi đã lo lắng rằng CASCADE DELETE sẽ làm rối loạn trạng thái bộ nhớ nhưng nếu EF luôn cập nhật thì nó hoạt động! – LPCRoy

+0

đây là giải pháp rất tốt vì bạn không phải lo lắng về các thực thể liên quan khác. Chỉ cần thiết lập xóa tầng trên DB - mọi thứ sẽ được sạch sẽ và đơn giản. – torpederos

7

trong bài viết này, Alex Jamese (người đăng câu trả lời của mình), có một bài viết hoàn chỉnh về chủ đề này.

http://blogs.msdn.com/b/alexj/archive/2009/08/19/tip-33-how-cascade-delete-really-works-in-ef.aspx

EF là chịu trách nhiệm về tính đúng đắn của ObjectContext sau SaveChanges(). Vì vậy, EF cố gắng đồng bộ hóa ObjectContext, với trạng thái cơ sở dữ liệu dự kiến ​​sau khi thác dự kiến ​​trong cơ sở dữ liệu. Một dấu hiệu cho biết câu chuyện này là nếu bạn mở một cái gì đó như SqlProfiler, bạn sẽ thấy EF yêu cầu DELETE cho các thực thể phụ thuộc mà nó biết (tức là được nạp trong ObjectContext) khi một hiệu trưởng bị xóa. Về cơ bản những gì đang xảy ra ở đây là Khuôn khổ thực thể hy vọng rằng việc xóa hiệu trưởng trong cơ sở dữ liệu, sẽ xóa tất cả những người phụ thuộc của nó trong cơ sở dữ liệu. Vì vậy, nó vấn đề, những gì cần được, một DELETE dư thừa để yêu cầu chính nó để những người phụ thuộc đã được tải sẽ bị xóa khỏi ObjectContext. Điều quan trọng cần lưu ý là EF không truy xuất tất cả các thực thể phụ thuộc và phát hành xóa đối tượng: Chỉ xóa những người phụ thuộc đã có trong bộ nhớ.

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