2010-08-18 41 views
11

Tôi có dịch vụ này là Singleton và Single threaded và phục vụ các nhóm khách hàng có khối lượng thấp. Nó sử dụng Entity Framework và Data trong SQL Server.Entity Framework (3.5) - Từ chối các thay đổi

Nếu bất kỳ yêu cầu lưu dữ liệu nào của khách hàng không thành công, tất cả các yêu cầu tiếp theo sẽ không thành công như mọi lần cố gắng lưu đối tượng dữ liệu ban đầu không thành công.

Có cách nào để Hoàn tác thay đổi đối với dữ liệu EF khi lưu không thành công không?

Cảm ơn trước

Trả lời

4

Câu trả lời cho câu hỏi là "Bạn không thể hủy thay đổi đối với ngữ cảnh" thay vì phải loại bỏ ObjectContext như Marc đã giải thích.

11

Entity-mô hình/dữ liệu bối cảnh/etc là tốt nhất xử lý như đơn vị công việc. Nếu bạn cần hủy bỏ nó, chỉ cần loại bỏ bối cảnh và bắt đầu với một bối cảnh mới. Và nếu bạn thành công, hãy loại bỏ nó đi! Mỗi yêu cầu thực sự nên được sử dụng riêng biệt dữ liệu bối cảnh, nếu không bạn có thể nhận được một loạt các vấn đề:

  • luồng (mặc dù nó có vẻ bạn đã tránh được điều này bằng cách làm cho nó đơn luồng)
  • tăng trưởng dữ liệu (có là một người quản lý danh tính, mỗi hàng bạn chạm vẫn xung quanh; nhiều lần, trên thực tế)
  • cách ly chung vv
  • quản lý kết nối đời (hogging một kết nối mở)
  • vv
+0

Có tôi nhận ra rằng quá muộn .. nhưng vấn đề là nếu bạn vứt bỏ bối cảnh đối tượng và cố gắng kết nối cơ sở dữ liệu, hiệu suất là quá xấu. Vì vậy, chúng tôi quyết định giữ cho bối cảnh Object sống động. Cố gắng tìm cách chúng ta có thể khôi phục các thay đổi trong trường hợp thất bại. – Bhuvan

+0

@ Bhuvan - tuyên bố "hiệu suất xấu" thường có nghĩa là bạn đang truy vấn dữ liệu quá mức. Tôi đã thực hiện ** rất nhiều ** công việc trong đó bối cảnh dữ liệu rất chặt chẽ, và nó hoàn toàn có hiệu suất. –

3

Bạn có thể làm mới thực thể bằng cách gọi

context.Refresh(RefreshMode.StoreWins, entity) 

vì vậy tôi thấy không cần RejectChanges.

+0

Cảm ơn Sven .. Nhưng vấn đề với điều này là người ta phải theo dõi những thực thể nào được thay đổi. Tôi có một chuỗi các thực thể cần được cam kết hoặc bị từ chối nếu lưu không thành công. Tôi nghĩ rằng MS phải cung cấp một cách tốt hơn để xử lý này. – Bhuvan

8

Lưu ý: bạn có thể nâng cấp lên EF 4.1 hoặc 4.2 mà làm công việc này dễ dàng như một nét duyên dáng:

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

Vui lòng tham khảo this để xem chi tiết.

Tạo một lớp học phần để ObjectContext lớp tạo của bạn, và bao gồm các phương pháp sau đây trong nó (VB, xin lỗi - nên dễ dàng sao chép lại để C#):

Public ReadOnly Property DirtyObjects() As IEnumerable(Of ObjectStateEntry) 
    Get 
    Return ObjectStateManager.GetObjectStateEntries(
     EntityState.Added Or 
     EntityState.Deleted Or 
     EntityState.Modified) 
    End Get 
End Property 


Public Overloads Sub Refresh() 
    For Each entry In DirtyObjects 
    Select Case entry.State 

     Case EntityState.Modified 
     Dim original = entry.OriginalValues 
     For Each prop In entry.GetModifiedProperties() 
      Dim ordinal = original.GetOrdinal(prop) 
      entry.CurrentValues.SetValue(ordinal, original(ordinal)) 
      RaisePropertyChanged(entry.Entity, prop) 
     Next 
     entry.AcceptChanges() 
     Case EntityState.Deleted 
     'I think I would need to call the above again, cuz it might be 
     'changed values on a Deleted-state entry too. 
     entry.ChangeState(EntityState.Unchanged) 
     Case EntityState.Added 
     entry.ChangeState(EntityState.Detached) 
     Case Else 
     'do nothing 
     Debug.Fail("It's not supposed to stop here.") 
    End Select 
    Next 
End Sub 

đứng đầu lên! Trong phiên bản mới sắp tới tính năng này đã trở thành địa ngục dễ dàng hơn rất nhiều.

+1

. Cảm ơn .. Giải pháp tuyệt vời ... – Bhuvan

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