【发布时间】:2011-04-07 19:07:50
【问题描述】:
Entity Framework 4、POCO 对象和 ASP.Net MVC2。我有一个多对多的关系,比如说 BlogPost 和 Tag 实体之间。这意味着在我的 T4 生成的 POCO BlogPost 类中,我有:
public virtual ICollection<Tag> Tags {
// getter and setter with the magic FixupCollection
}
private ICollection<Tag> _tags;
我从 ObjectContext 的一个实例中请求一个 BlogPost 和相关的标签,并将它发送到另一个层(MVC 应用程序中的视图)。稍后我取回更新后的 BlogPost,其中包含更改的属性和更改的关系。例如,它有标签“A”、“B”和“C”,新标签是“C”和“D”。在我的特定示例中,没有新的标签,并且标签的属性永远不会改变,所以唯一应该保存的是改变的关系。现在我需要将它保存在另一个 ObjectContext 中。 (更新:现在我尝试在同一个上下文实例中进行操作,但也失败了。)
问题:我不能让它正确地保存关系。我尝试了所有找到的方法:
- Controller.UpdateModel 和 Controller.TryUpdateModel 不起作用。
- 从上下文中获取旧的 BlogPost 然后修改集合不起作用。 (与下一点不同的方法)
- This 可能会起作用,但我希望这只是一种解决方法,而不是解决方案:(。
- 尝试了以各种可能的组合为 BlogPost 和/或标签添加/添加/更改对象状态功能。失败。
- This 看起来像我需要的,但它不起作用(我试图修复它,但无法解决我的问题)。
- 尝试过ChangeState/Add/Attach/...上下文的关系对象。失败。
“不起作用”在大多数情况下意味着我在给定的“解决方案”上工作,直到它没有产生错误并至少保存了 BlogPost 的属性。关系会发生什么变化:通常标签会使用新的 PK 再次添加到标签表中,并且保存的 BlogPost 引用这些而不是原始的。当然,返回的标签有 PK,在保存/更新方法之前,我检查了 PK,它们与数据库中的相同,所以 EF 可能认为它们是新对象,而这些 PK 是临时对象。
我知道并且可能无法找到自动化简单解决方案的问题:当 POCO 对象的集合发生更改时,上述虚拟集合属性应该会发生这种情况,因为这样 FixupCollection 技巧将更新反向引用多对多关系的另一端。然而,当视图“返回”一个更新的 BlogPost 对象时,这并没有发生。这意味着我的问题可能没有简单的解决方案,但这会让我非常难过,我会讨厌 EF4-POCO-MVC 的胜利:(。这也意味着 EF 不能在 MVC 环境中做到这一点。使用 EF4 对象类型:(。我认为基于快照的更改跟踪应该发现更改后的 BlogPost 与具有现有 PK 的标签有关系。
顺便说一句:我认为一对多关系也会出现同样的问题(谷歌和我的同事都这么说)。我会在家里试一试,但即使这对我的应用程序中的六个多对多关系没有帮助:(。
【问题讨论】:
-
请发布您的代码。这是一种常见的情况。
-
我有这个问题的自动解决方案,它隐藏在下面的答案中,所以很多人会错过它,但请看一下,因为它会为你节省一份工作see post here
-
@brentmckendrick 我认为另一种方法更好。与其通过网络发送整个修改后的对象图,不如直接发送增量?在这种情况下,您甚至不需要生成的 DTO 类。如果您对此有任何意见,请联系stackoverflow.com/questions/1344066/calculate-object-delta 讨论。
标签: asp.net-mvc entity-framework-4 poco