1

我正在使用 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吗?

谢谢。

4

1 回答 1

1

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

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

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

方法是使用以下代码:

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

//update the data of the entity.

myContext.SaveChanges();

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

稍后,是附加到上下文中,然后可以进行修改。当一个字段发生变化时,实体将其状态更改为已修改,因此当调用 saveChanges() 时,EF 更新实体,而不是尝试添加新实体。

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

于 2012-05-26T08:44:49.633 回答