Entity framework 如何使用BackgroundWorker在实体框架中正确使用对象上下文
我正在使用实体框架和WPF进行开发,我遇到了一些错误,我不知道为什么。保存记录时(使用Entity framework 如何使用BackgroundWorker在实体框架中正确使用对象上下文,entity-framework,backgroundworker,Entity Framework,Backgroundworker,我正在使用实体框架和WPF进行开发,我遇到了一些错误,我不知道为什么。保存记录时(使用BackgroundWorker),我将entities change tracker设置为nothing(null),将记录附加到新的一次性上下文,保存、分离并处置上下文 保存记录会在程序的MainViewModel中触发事件,其他ViewModels(包括正在保存的)需要刷新其实体以反映更改 Private Sub _saveRecordWorker_DoWork(ByVal sender As Objec
BackgroundWorker
),我将entities change tracker设置为nothing(null),将记录附加到新的一次性上下文,保存、分离并处置上下文
保存记录会在程序的MainViewModel
中触发事件,其他ViewModels
(包括正在保存的)需要刷新其实体以反映更改
Private Sub _saveRecordWorker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles _saveRecordWorker.DoWork
Using MyContext As New RVShippingEntities
Dim MyShipment = CType(ShipmentRecord, IEntityWithChangeTracker)
MyShipment.SetChangeTracker(Nothing)
MyContext.Attach(MyShipment)
MyContext.Detach(ShipmentRecord)
End Using
End Sub
刷新后台工作程序与此类似,但它有一个Do While
块,以防止它干扰save工作程序(该工作程序似乎不工作;因此为post)。保存(随后刷新)时,出现以下错误:
调用线程无法访问此对象,因为其他线程拥有它。
我认为使用DoWhile
块,它会等待(当我一步一步地执行时)直到保存线程完成,一切都会很好。但似乎有什么东西(主线程或保存线程)仍在进行干扰
有更好的方法吗?我是不是在用愚蠢的方式做这件事?任何帮助都将不胜感激
(显然,Firefox将kludgey视为一个词。很有趣)那么,3个多月了,到目前为止,实体框架还没有例外。我将称之为答案
父视图(在我的案例中是公司、客户、装运)有一个上下文,该上下文根据需要传递给子视图(地址、电话号码、电子邮件地址,适用于公司和客户;包裹、内容,适用于装运)。每当上下文无法保存更改或您所做的任何更改时(db断开是最常见的原因),都会释放上下文,实例化一个新的上下文,重新附加实体,将其设置为“修改”(基于我对UI所做的自定义更改跟踪),并保存更改。我正在使用EF thusly:每个Perent视图都有一个上下文。子视图(例如联系人地址或装运包裹)共享其父视图的上下文。为了维护上下文,我偶尔保存数据(这成为一项要求;偶尔自动保存)并刷新数据。如果由于某种原因失败,则实体将被解除跟踪,上下文将被销毁、重新创建,实体将附加到新上下文,并设置为“已修改”、“已保存”,所有操作都将像以前一样继续。对用户透明。到目前为止,它似乎运行得很好。