将视图转换为表格并保存更改会带来乐观的并发异常

我正在使用实体框架4(使用自我跟踪实体),并访问一个视图,即合并两个表。因此,当我更新视图的信息时,我将视图的STE发送到访问数据库的存储库。

我做了以下工作:

当我收到更新的信息后,我创建了我的STE1和STE2。当我创建一个STE时,如何创建一个添加状态。因此,我如何知道状态被修改的视图的STE状态,我使用方法 MarkedAsModified 更改了两个STE的状态。

然后,我如何在视图的STE中拥有这两个表的信息,我将视图中的信息传递给正确的STE,并将来自STE的更改应用于 objectContext

最后,我制作 saveChanges 。但是在这一步我收到一个乐观并发异常。我认为这是因为STE从状态传递到添加Modified ,所以上下文检测到创建和 SaveChanges 代码>,但我也尝试在STE中使用 AcceptChanges ,稍后将其标记为已修改并应用更改,最后是 SaveChanges ,但问题仍然存在。

我该如何解决这个问题?有更好的方式来处理view和Entity Framework v4?

谢谢。 Daimroc。

编辑1:我仍然有问题。我的代码如下:

组件myComponent = new Components(); //这是一个STE myComponent.Reference = myView.Reference; ... //其他属性 myComponent.MarkedAsModified(); //这是需要的,因为我想更新信息,不需要添加新的寄存器。 myContext.ApplyChanges(“Components”,myComponent); miContexto.SaveChanges();

在saveChanges中,我得到了异常:更新,插入或删除语句影响了意外数量的行(0)。自实体加载后,实体可能已被修改或删除。刷新ObjectStateManager条目。

问题是哪个?我可以不修改创建的新STE吗?

谢谢。

1
额外 编辑
意见: 2
你能提供代码块吗,这样我们就可以看到你做了什么?
额外 作者 George Taskos,

1 答案

我找到了解决问题的方法。

在第一种解决方案中,解决方案是查询数据库以获取数据库中现有的寄存器。这将在上下文中添加实体,然后可以修改数据并正确保存更改。

但是后来,我找到了避免将查询作为数据库来在上下文中添加已修改实体的方法。

方法是使用以下代码:

Customers myCustomer = new Customers  { IDCustomer = myCustomer.IDCustomer };
myContext.Customers.Attach(myCustomer);

//update the data of the entity.

myContext.SaveChanges();

解决方案是创建一个设置主键的新实体。如果实体具有FK,它将以相同的方式表示。此时,该实体具有添加状态。

后来被附加到上下文中,然后可以修改。当字段改变时,实体将其状态更改为修改状态,所以当调用saveChanges()时,EF更新实体,而不是尝试添加新实体。

我在链接。在这篇文章中,解决方案是删除一个实体而不将其检索到数据库,如果我们想要修改一个现有的寄存器,这个想法也可以工作。

1
额外
这是一个部分解决方案,我想使用STE并可以使用markedAsModified,然后将更改应用于上下文。
额外 作者 Álvaro García,