将视图转换为表并 savechanges 给我带来乐观并发异常
-
12-12-2019 - |
题
我正在使用 Entity Framework 4(使用自跟踪实体),并访问一个视图,即两个表的合并。因此,当我更新视图的信息时,我将视图的 STE 发送到访问数据库的存储库。
我做了以下事情:
当我收到包含更新信息的视图时,我创建 STE1 和 STE2。当我创建 STE 时,它是如何通过添加状态创建的。那么我如何知道视图的 STE 的状态已修改,我使用以下方法更改了两个 STE 的状态 MarkedAsModified
.
然后,我如何在视图的 STE 中获取两个表的信息,将信息从视图传递到正确的 STE,并将 STE 的更改应用到 objectContext
.
最后我做了 saveChanges
. 。但在这一步我收到一个 Optimistic concurrency exception
. 。我认为这是因为 STE 从国家转移到 Added
到 Modified
所以上下文检测到创建和创建之间存在一些修改 SaveChanges
, ,但我也尝试 AcceptChanges
在 STE 中,稍后标记为已修改,然后应用更改,最后 SaveChanges
, ,但问题仍然存在。
我该如何解决这个问题?有更好的方法来使用视图和实体框架 v4 吗?
谢谢。戴姆洛克。
编辑1:我仍然有问题。我的代码如下:
组件 myComponent = new Components();//这是一个ste mycomponent.rereference = myview.Reference;...//其他属性mycomponent.markedasmodified();//这是需要的,因为我想更新信息,而不是添加新的寄存器。myContext.ApplyChanges("组件", myComponent);miContexto.SaveChanges();
在 saveChanges 中,我得到了异常:更新、插入或删除语句影响了意外数量的行 (0)。自加载实体以来,实体可能已被修改或删除。刷新 ObjectStateManager 条目。
到底是哪一个问题呢?我可以不修改新创建的STE吗?
谢谢。
解决方案
我已经找到解决问题的方法了。
在第一个解决方案中,解决方案是对数据库进行查询以获取数据库中的现有寄存器。这将在上下文中添加实体,然后可以修改数据并正确保存更改。
但后来,我找到了避免需要查询数据库以在上下文中添加修改的实体的方法。
方法是使用以下代码:
Customers myCustomer = new Customers { IDCustomer = myCustomer.IDCustomer };
myContext.Customers.Attach(myCustomer);
//update the data of the entity.
myContext.SaveChanges();
解决方案是创建一个设置主键的新实体。如果该实体具有 FK,则会以相同的方式表示。此时,实体已处于添加状态。
稍后,附加到上下文中,然后可以修改。当字段更改时,实体将其状态更改为已修改,因此当调用 saveChanges() 时,EF 会更新实体,而不是尝试添加新实体。
我在这个中找到了这个信息 关联. 。在这篇文章中,解决方案是删除一个实体而不将其检索到数据库,但是如果我们想修改现有寄存器,这个想法也适用。