1
145
让我们这样试试:
我猜我的一个评论给了你错误的希望,EF会为你做合并。我对这个问题做了很多研究,我的结论是EF不会为你做这些。我想你也发现了我的问题 MSDN . 实际上,互联网上有很多这样的问题。问题是没有明确说明如何处理这种情况。让我们来看看这个问题: 问题背景
基于以上描述,我们可以清楚地说明EF更适合于实体始终连接到上下文的连接场景,这是WinForm应用程序的典型情况。Web应用程序需要断开连接的场景,其中在请求处理之后关闭上下文,并将实体内容作为HTTP响应传递给客户端。下一个HTTP请求提供实体的修改内容,该实体必须重新创建、附加到新上下文并持久化。娱乐通常发生在上下文范围之外(带有持续忽略的分层架构)。 解决方案
在单个实体上手动同步很容易。您只需要附加实体并调用AddObject进行插入,DeleteObject进行删除,或者将ObjectStateManager中的state设置为Modified进行更新。当你不得不处理对象图而不是单个实体时,真正的痛苦就来了。当您必须处理独立关联(那些不使用外键属性的关联)和多对多关系时,这种痛苦会更严重。在这种情况下,您必须手动同步对象图中的每个实体以及对象图中的每个关系。 MSDN文档建议将手动同步作为解决方案: Attaching and Detaching objects 说:
提到的方法是ObjectStateManager=manual change tracking的ChangeObjectState和ChangeRelationshipState。其他MSDN文档文章中也有类似的建议: Defining and Managing Relationships
此外,还有 blog post
EF有许多“有用的”操作和设置,如 Refresh , Load , ApplyCurrentValues , ApplyOriginalValues , MergeOption
EF团队提供的不是真正的合并功能,而是 Self Tracking Entities (STE)这并不能解决问题。首先,只有当同一个实例用于整个处理时,STE才起作用。在web应用程序中,情况并非如此,除非您将实例存储在视图状态或会话中。因此,我对使用EF非常不满意,我将检查NHibernate的特性。第一次观察表明,NHibernate可能有这样的 functionality . 结论 related question 在MSDN论坛上。查看Zeeshan Hirani的答案。他是这本书的作者 Entity Framework 4.0 Recipes . 如果他说不支持对象图的自动合并,我相信他。 但仍有可能我完全错了,EF中存在一些自动合并功能。 编辑2: 如您所见,这已经添加到 MS Connect 正如2007年的建议。MS已经关闭了它,作为下一个版本中要做的事情,但实际上除了STE之外,并没有做任何事情来改善这个差距。 |
2
19
我有一个解决问题的办法,上面所描述的拉迪斯拉夫。我为DbContext创建了一个扩展方法,它将根据所提供的图和持久化图的差异自动执行添加/更新/删除操作。
|
3
9
我知道这是晚了行动,但由于这是一个非常常见的问题,我张贴了这一点,以防它服务于其他人。
它甚至适用于多重关系 |
4
7
实体框架团队意识到这是一个可用性问题,并计划在EF6之后解决它。 来自实体框架团队:
如果这对您有影响,请在 |
5
1
我发现,如果我不在父实体中使用关系,而只是添加和删除子实体,那么一切都可以正常工作。
父实体“Report”与“ReportRole”具有一对多关系,并具有属性“ReportRoles”。新角色由Ajax调用中以逗号分隔的字符串传入。 第一行将删除所有子实体,如果使用“report.ReportRoles.Remove删除(f) “而不是”db.ReportRoles.Remove删除(f) “我会得到错误。
|
Gary McGill · 如何在EF中使用/保持POCO对象关系? 12 年前 |