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.
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
@ 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. –