2009-06-24 23 views
5

Có thể truy vấn ngữ cảnh, thực hiện thay đổi đối tượng hay không và truy vấn lại ngữ cảnh và lấy lại kết quả bao gồm thực thể đã thay đổi mà không thực hiện thao tác hủy ? (Tôi không muốn rút lui vì tôi có thể muốn khôi phục)Khung pháp nhân truy vấn bao gồm các hồ sơ chưa được cam kết

Tôi biết tôi có thể lấy lại các thay đổi bằng cách sử dụng GetObjectStateEntries, nhưng tôi quan tâm đến toàn bộ tập dữ liệu .. không chỉ các thực thể đã thay đổi.

Tôi nghĩ cách duy nhất để làm điều này là với một savechang, nhưng quấn một giao dịch xung quanh tất cả mọi thứ để tôi có thể làm một rollback nếu tình trạng của tôi không được đáp ứng. Hoặc tôi thiếu một cái gì đó dễ dàng hơn?

+0

Chính xác thì bạn đang cố gắng làm gì? Tại sao bạn cần truy cập vào bộ mới trước khi bạn cam kết? Bạn đang cố gắng thực hiện một số loại xác thực để ngăn chặn trùng lặp hoặc cái gì khác yêu cầu bạn so sánh các thực thể được chèn/sửa đổi với tất cả các thực thể khác trong tập hợp? – Merritt

+0

Về cơ bản có. Nó không phải là quá nhiều mà tôi muốn ngăn chặn một cam kết nhưng tôi muốn cập nhật một thực thể dựa trên điều kiện của trạng thái hiện tại của tất cả các thực thể (thay đổi và không thay đổi). Đó là quy tắc kinh doanh giống như quy trình làm việc. Thật không may, nhà nước có thể thay đổi trong các dịch vụ khác nhau mà tôi gọi (với một bối cảnh được lưu trữ) mà không .savechanges(). Vì vậy, theo dõi những thay đổi này đang gây khó khăn. – itchi

+0

Điều này nghe giống như một thao tác có thể được thực hiện bởi một dịch vụ/ứng dụng khác (hoặc trên một chuỗi khác ít nhất). Bạn có thể tạo một dịch vụ cửa sổ (hoặc một công việc sql) để xử lý các bản cập nhật? Có một số lý do nó phải được thực hiện trước khi SavingChanges()? – Merritt

Trả lời

3

Tại sao không hợp nhất tập hợp các thực thể hiện tại với các đối tượng được thêm vào? Tôi đã thử nghiệm ra điều này và có vẻ như work- nó không chiếm Xóa mặc dù, nhưng bạn sẽ có thể để có được những ý tưởng:

// get the entities that have been inserted or modified 
var projects = myObjectContext.ObjectStateManager.GetObjectStateEntries(
    EntityState.Added | EntityState.Modified).Where(
      x => x.Entity is Project).Select(x=> (Project) x.Entity); 

// get existing entities, exclude those that are being modified 
var projects2 = myObjectContext.Projects.Where(
    BuildDoesntContainExpression<Project, int>(z => z.ProjectId, 
      projects.Select(x => x.ProjectId))); 

// Union the 2 sets 
var projects3 = projects.Union(projects2); 

BuildDoesntContainExpression: bạn không thể sử dụng chứa, và do đó bạn không thể làm ngược lại, với EF vì lý do nào đó, vì vậy hãy sử dụng phương pháp này:

private static Expression<Func<TElement, bool>> BuildDoesntContainExpression<TElement, TValue>( 
     Expression<Func<TElement, TValue>> valueSelector, IEnumerable<TValue> values) 
    {  
     if (null == valueSelector) 
     { 
      throw new ArgumentNullException("valueSelector"); 
     } 

     if (null == values) 
     { 
      throw new ArgumentNullException("values"); 
     }  

     ParameterExpression p = valueSelector.Parameters.Single();  

     // p => valueSelector(p) == values[0] || valueSelector(p) == ... 
     if (!values.Any())  
     {   
      return e => false;  
     }  

     var equals = values.Select(
      value => (Expression)Expression.NotEqual(valueSelector.Body, Expression.Constant(value, typeof(TValue))));  

     var body = equals.Aggregate<Expression>((accumulate, equal) => Expression.And(accumulate, equal));  

     return Expression.Lambda<Func<TElement, bool>>(body, p); 
    } 
+0

Vâng, tôi cũng đang cân nhắc cách tiếp cận này. Không nên có một cách dễ dàng hơn? Tôi ngạc nhiên câu hỏi này không phổ biến hơn. – itchi

+0

Tôi cung cấp cho bạn câu trả lời bởi vì công nghệ này hoạt động. Mặc dù, tôi chắc chắn có một cách đơn giản hơn. Nhưng bạn đã đặt một số suy nghĩ tuyệt vời vào điều này và xứng đáng với những điểm :) Cảm ơn! – itchi

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