14

Làm thế nào để cập nhật TẤT CẢ các thực thể bị bẩn từ kho dữ liệu và đặt lại các giá trị đã thay đổi của chúng thành giá trị lưu trữ ban đầu?ObjectContext.Refresh()?

Phương thức ObjectContext.Refresh yêu cầu làm tham số để thực thể làm mới.

Trả lời

16

Sau đây thường hoạt động:

Context.Refresh(RefreshMode.StoreWins, _ 
    Context.ObjectStateManager.GetObjectStateEntries()) 

Nó đôi khi gây ra vấn đề với EntityRelations. xem nhận xét của tôi để biết thêm chi tiết.

+0

Điều này chỉ lưu cho tôi nhiều dòng mã đi bộ đồ thị đối tượng bản thân mình. –

+0

Có lỗi, vui lòng xem: http://stackoverflow.com/questions/1757872/undelete-an-entity-marked-as-entitystate-delete – Shimmy

+0

Đôi khi bạn muốn cập nhật ngay cả các mục không thay đổi, cuz bạn muốn làm mới chúng chống lại những thay đổi được thực hiện trong cơ sở dữ liệu của các máy khách khác. – Shimmy

0

Nếu bạn muốn đặt lại TẤT CẢ các thay đổi, bạn có thể đặt ObjectContext thành không và khởi tạo lại.

Tôi tin rằng điều này sẽ đạt được những gì bạn muốn.

Kindness,

Dan

+3

Tôi đoán bạn làm việc với ASP .NET, vì vậy thật dễ dàng để bạn nói nó, tôi sử dụng một thể hiện ngữ cảnh dài vòng đời. – Shimmy

0

Chúng tôi sử dụng này:

return Context.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Deleted 
System.Data.EntityState.Modified).All(ose 
    => { 
    if(ose.Entity != null) 
     Context.Refresh(RefreshMode.StoreWins, ose.Entity); 
     return true; 
    }); 

đâu "ngữ cảnh" là bối cảnh để làm mới. Chúng tôi lọc theo trạng thái thay đổi và thực thể để tránh các thực thể và quan hệ mới.

+0

Nó không phải là xấu, nhưng nó sẽ không làm việc cho các mối quan hệ. – Shimmy

10

Bạn có thể sử dụng mã này:

public void RefreshAll() 
{ 
    // Get all objects in statemanager with entityKey 
    // (context.Refresh will throw an exception otherwise) 
    var refreshableObjects = (from entry in context.ObjectStateManager.GetObjectStateEntries(
               EntityState.Deleted 
               | EntityState.Modified 
               | EntityState.Unchanged) 
             where entry.EntityKey != null 
             select entry.Entity); 

    context.Refresh(RefreshMode.StoreWins, refreshableObjects); 
} 

Tôi đã viết một bài về cách RefreshAll() và làm mới các bối cảnh trong một số cách khác:

http://christianarg.wordpress.com/2013/06/13/entityframework-refreshall-loaded-entities-from-database/

+0

Điều này sẽ ném một ngoại lệ nếu bạn đã thêm các mục. Thêm điều này trước khi sửa: 'var addedEntries = context.ObjectStateManager.GetObjectStateEntries (EntityState.Added) .ToList(); addedEntries.ForEach (entry => entry.Delete()); ' – AncientSyntax

+0

@AncientSyntax Bạn nói đúng về ngoại lệ. Trên thực tế, nếu bạn nghĩ về nó là không có ý nghĩa để cố gắng làm mới một thực thể vừa được thêm vào. Tôi đã chỉnh sửa câu trả lời xóa EntityState.Added khỏi mã. Trong giải pháp được đề xuất của bạn, bạn thực sự đang xóa thực thể vừa thêm, vì vậy không có gì sẽ được thêm vào. –

+0

Đây có phải là liên quan đến phiên bản SQL, vì vậy nó hoạt động khi chạy trên một máy chủ SQL 12.0 nhưng 11.0? – jcubero