我正在开发使用实体框架和WPF,并遇到一些错误,我不知道为什么。在保存记录时(使用BackgroundWorker
),我将实体更改为空(空),将记录附加到新的一次性上下文中,保存它,分离并处理上下文。如何在使用BackgroundWorker的实体框架中正确使用对象上下文
在程序的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
块,以保持它与保存工作人员的干扰(这似乎没有奏效,因此后)。当我保存(并随后刷新)时,出现以下错误: 调用线程无法访问此对象,因为不同的线程拥有它。
我认为,与DoWhile
块,它会等待(当我一步一步通过它),直到保存线程完成,一切都会很好。但似乎某些东西(无论是主线程还是保存线程)仍在做一些干扰事情。
有没有更好的方法来做到这一点?我是否以愚蠢的方式做这件事?任何帮助,将不胜感激。
(显然Firefox的认可kludgey作为一个字。有趣)
我这样使用EF:每个Perent视图都有一个上下文。子视图(例如,联系地址或货件包裹)共享其父项的上下文。为了保持上下文,我偶尔保存数据(这成为了需求;偶尔自动保存)并刷新数据。如果由于某种原因失败了,那么实体将被分开,上下文被销毁,重新创建,实体被附加到新的上下文,被设置为被修改,被保存并且如前所述继续。对用户透明。到目前为止,它似乎工作得很好。 – CodeWarrior 2011-04-11 21:52:53