2010-05-25 57 views
0

我正在开发使用实体框架和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作为一个字。有趣)

+0

我这样使用EF:每个Perent视图都有一个上下文。子视图(例如,联系地址或货件包裹)共享其父项的上下文。为了保持上下文,我偶尔保存数据(这成为了需求;偶尔自动保存)并刷新数据。如果由于某种原因失败了,那么实体将被分开,上下文被销毁,重新创建,实体被附加到新的上下文,被设置为被修改,被保存并且如前所述继续。对用户透明。到目前为止,它似乎工作得很好。 – CodeWarrior 2011-04-11 21:52:53

回答

0

所以3+个月,相对于实体框架到目前为止进制异常。我打算称这个答案。根据需要(地址,电话号码,电子邮件地址,公司和客户;包裹,内容,发货),父视图(以我的公司,客户,货件为例)具有传递给子视图的上下文。任何时候上下文无法保存更改或者你有什么(db断开是最常见的原因),上下文被处理,一个新的实例,实体被重新连接,设置为修改(基于我所做的自定义更改跟踪为用户界面),并保存更改。

相关问题