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

我做了以下事情:

当我收到包含更新信息的视图时,我创建 STE1 和 STE2。当我创建 STE 时,它是如何通过添加状态创建的。那么我如何知道视图的 STE 的状态已修改,我使用以下方法更改了两个 STE 的状态 MarkedAsModified.

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

最后我做了 saveChanges. 。但在这一步我收到一个 Optimistic concurrency exception. 。我认为这是因为 STE 从国家转移到 AddedModified 所以上下文检测到创建和创建之间存在一些修改 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 会更新实体,而不是尝试添加新实体。

我在这个中找到了这个信息 关联. 。在这篇文章中,解决方案是删除一个实体而不将其检索到数据库,但是如果我们想修改现有寄存器,这个想法也适用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top