2013-05-22 26 views
8

Không có Detach(object entity) trên DbContext trong Entity Framework 5.Mang lại phương pháp DbContext.Detach() với một phương pháp mở rộng (EF5)

Để tách một thực thể, nhà nước bây giờ cần phải được thay đổi. Có lẽ tôi đang thiếu một cái gì đó, nhưng điều này dường như ít nhiều trực quan và dễ đọc hơn bằng cách sử dụng Detach phương pháp:

context.Entry(myEntity).State = EntityState.Detached; 

Tôi bị cám dỗ để chỉ cần tạo một phương pháp mở rộng để mang lại phương pháp Detach:

public static void Detach(this MyEntities context, object entity) 
{ 
    context.Entry(entity).State = EntityState.Detached; 
} 

Lý do tại sao Microsoft loại bỏ phương thức DbContext.Detach() trong EF 5 là gì?

+1

"Tôi bị cám dỗ chỉ cần tạo một phương pháp mở rộng" - Tại sao bạn sẽ tạo một phương pháp mở rộng cho một lớp học mà bạn có toàn quyền kiểm soát? Bạn có thể thêm nó vào 'WIMTEntities' trực tiếp. – hvd

Trả lời

16

Loại bỏ một phương pháp Detach từ (DbContext) API có một số logic vì Detach không hoạt động trên một đồ thị đối tượng nhưng nó chỉ tách đối tượng duy nhất mà bạn vượt qua vào phương pháp. Điều này khác với tất cả các phương pháp khác mà thay đổi trạng thái đối tượng:

  • Attach gắn các đối tượng được cung cấp bao gồm tất cả các đối tượng liên quan trong đồ thị đối tượng bất động sản chuyển hướng
  • Add thêm đối tượng được cung cấp bao gồm tất cả các đối tượng liên quan đến bối cảnh
  • Remove xóa các đối tượng được cung cấp bao gồm các đối tượng liên quan đã được cấu hình với tầng xóa

Trên thiết Mặt khác nhà nước theo cách thủ công để Modified, Added hoặc Deleted luôn chỉ hoạt động trên đối tượng được cung cấp, không chỉ trên các đối tượng liên quan. Đây cũng là trường hợp để gọi phương thức Detach của ObjectContext. Kết quả là tách một đối tượng chỉ bằng cách đặt trạng thái thành Detached để phù hợp với hành vi của các thay đổi trạng thái khác bởi vì như thiết lập bất kỳ trạng thái nào khác, nó chỉ ảnh hưởng đến đối tượng được cung cấp mà không có các đối tượng liên quan.

DbContext là - trong số các tính năng khác - có ý định làm việc với Khung thực thể dễ dàng hơn. Phương pháp cũ Detach gây nhầm lẫn hơn và hành vi của nó không giống như nhiều nhà phát triển mong đợi. (Herehere là hai tham chiếu về sự nhầm lẫn này và các phức tạp liên quan đến việc tách một đối tượng.) Theo tôi, đó không phải là bước sai để xóa nó khỏi API DbContext.

Vâng, bạn luôn có thể viết cho mình phương thức tiện ích mở rộng như bạn đã thực hiện hoặc truy cập vào số ObjectContext cơ bản thông qua bộ điều hợp nếu bạn thực sự muốn có phương thức Detach.

5

Tôi không biết lý do tại sao không có phương pháp Detach() nhưng lớp DbSet cho thấy một phương pháp AsNoTracking() để lấy đối tượng mà được tách ra từ DbContext.

Dưới đây là một số mã ví dụ từ here

using (var context = new UnicornsContext()) 
{ 
    // Query for all unicorns without tracking them 
    var unicorns1 = context.Unicorns.AsNoTracking(); 

    // Query for some unitcorns without tracking them 
    var unicorns2 = context.Unicorns 
     .Where(u => u.Name.EndsWith("ky")) 
     .AsNoTracking() 
     .ToList(); 
} 
+0

Lưu ý [câu trả lời này] (http://stackoverflow.com/a/5600202/538763) cho biết rằng AsNoTracking có thể không tương đương với Detach. – crokusek

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