将视图转换为表和savechanges给了我乐观的并发异常

时间:2012-05-21 17:42:20

标签: entity-framework-4 view optimistic-concurrency

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

我做了以下事情:

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

然后,我在视图的STE中如何获得两个表的信息,我将视图中的信息传递给正确的STE,并将STE中的更改应用到objectContext

最后我制作了saveChanges。但是在这一步中我收到Optimistic concurrency exception。我认为这是因为STE从状态传递到AddedModified所以上下文检测到创建和SaveChanges之间有一些修改,但我也尝试{ STE中的{1}},后来标记为已修改,并应用更改,最后AcceptChanges,但问题仍然存在。

我该如何解决这个问题?有一种更好的方法来使用视图和实体框架v4?

感谢。 Daimroc。

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

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

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

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

感谢。

1 个答案:

答案 0 :(得分:1)

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

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

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

方法是使用以下代码:

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

//update the data of the entity.

myContext.SaveChanges();

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

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

我在此link中找到了此信息。在这篇文章中,解决方案是删除实体而不将其检索到数据库,如果我们想要修改现有的寄存器,那么这个想法也有效。