2010-04-26 18 views
20

Tôi muốn để có thể biết nếu có bất kỳ dữ liệu chưa được lưu trong một bối cảnh khung thực thể. Tôi đã tìm ra cách sử dụng ObjectStateManager để kiểm tra trạng thái của các thực thể hiện có, nhưng có hai vấn đề tôi có với điều này.Làm thế nào để biết nếu bất kỳ thực thể trong bối cảnh là bẩn với. Net Entity Framework 4.0

  1. Tôi muốn có một hàm duy nhất để gọi để xem có bất kỳ thực thể nào không được lưu thay vì lặp mặc dù tất cả các thực thể trong ngữ cảnh hay không.
  2. Tôi không thể tìm ra cách phát hiện các đối tượng mà tôi đã thêm. Điều này cho thấy rằng tôi không hoàn toàn hiểu được bối cảnh thực thể hoạt động như thế nào. Ví dụ, nếu tôi có đối tượng myContext.Employees, và tôi thêm một nhân viên mới vào tập này (với .AddObject), tôi không thấy thực thể mới khi tôi nhìn vào ObjectSet và tôi cũng không thấy .Count tăng. Tuy nhiên, khi tôi làm một context.SaveChanges(), thực thể mới của tôi vẫn tồn tại ... huh?

tôi đã không thể tìm ra câu trả lời cho điều này trong các tìm kiếm MSDN của tôi, vì vậy tôi đã hy vọng một ai đó ở đây sẽ có thể đầu mối cho tôi ở.

Cảm ơn trước.

Trả lời

15
var addedStateEntries = Context 
    .ObjectStateManager 
    .GetObjectStateEntries(EntityState.Added); 
+1

Ok, trông giống như câu trả lời. Tôi vẫn còn một chút nhầm lẫn là tại sao myContext.Employees ObjectSet không chứa thực thể mà tôi vừa thêm vào. –

+1

Vì 'ObjectSet' là các truy vấn, không phải là các bộ sưu tập. –

+0

Ok, chúng ta đang hiểu nhầm những gì mà những ObjectSets được cho là. Vì vậy, nó là chính xác để nói rằng những ObjectSets chỉ là trạng thái cơ sở dữ liệu của các thực thể? Nếu đó là sự thật, có một bộ sưu tập mà, ví dụ, có tất cả các thực thể nhân viên có trong bộ nhớ (không chỉ những người trong cơ sở dữ liệu)? –

3

Bài viết này mô tả chính xác những gì là cần thiết để thực hiện thay đổi theo dõi trong khung Entity:

Identity Resolution, State Management, and Change Tracking (Entity Framework) - MSDN

+0

ảnh vui nhộn. Không biết làm thế nào tôi bỏ lỡ điều đó. Cảm ơn. –

+0

Thực ra, tôi chỉ đọc bài viết đó và nó không trả lời câu hỏi của tôi. Tôi cần biết điều gì sẽ xảy ra nếu tôi thực hiện .SaveChanges. Các thực thể mới được thêm vào với context.AddObject không xuất hiện trong các thuộc tính ObjectSet ngoài đối tượng ngữ cảnh, vì vậy tôi không thể tham chiếu đến chúng để kiểm tra trạng thái của chúng. –

6

Một cách đơn giản để có được một tái sử dụng đơn phương pháp/tài sản mà bạn có thể thêm một phương pháp mới để ObjectContext của bạn bằng cách tạo một lớp học một phần và thêm một thuộc tính như thế này:

public partial class MyEntityContext 
{ 
    public bool IsContextDirty 
    { 
    get 
    { 
     var items = ObjectStateManager.GetObjectStateEntries(EntityState.Added); 
     if(items.Any()) 
     return true; 
     items = ObjectStateManager.GetObjectStateEntries(EntityState.Deleted); 
     if (items.Any()) 
     return true; 
     items = ObjectStateManager.GetObjectStateEntries(EntityState.Modified); 
     if(items.Any()) 
     return true; 
     return false; 
    } 
    } 
} 

Tùy thuộc vào những gì bạn đang tìm kiếm bạn có thể phơi bày các thuộc tính khác để biết nếu có chỉ là xóa hoặc sửa đổi. Phương pháp này có thể được đơn giản hóa, nhưng tôi muốn nó được rõ ràng những gì bạn sẽ cần phải làm.

+3

Bài đăng được cập nhật.Không bao giờ sử dụng 'Count()> 0' thay vì' Any() ',' Count() 'lặp lại qua toàn bộ tập hợp để lấy số,' Any() 'sẽ trả về true trên lần lặp đầu tiên. – Shimmy

+0

Ngoài ra, 'GetObjectStateEntries' không bao giờ được trả về' null'. – Shimmy

8

phương pháp khuyến nông Via (cho mỗi ObjectContext):

internal static class ObjectContextExtensions 
{ 
    public static bool IsContextDirty(this ObjectContext objectContext) 
    { 
     return objectContext 
      .ObjectStateManager 
      .GetObjectStateEntries(
       EntityState.Added | 
       EntityState.Deleted | 
       EntityState.Modified).Any(); 
    } 
} 

hoặc thông qua phương pháp từng phần (chỉ dành cho ObjectContext của bạn):

partial class MyModel 
{ 
    public bool IsContextDirty() 
    { 
     return ObjectStateManager 
      .GetObjectStateEntries(
       EntityState.Added | 
       EntityState.Deleted | 
       EntityState.Modified).Any(); 
    } 
} 
Các vấn đề liên quan