实体框架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 中。(更新: 现在我尝试在同一个上下文实例中执行,但也失败了。)
问题是: 我不能正确地挽救我们的关系,我尝试了所有我发现的方法:
“不起作用”意味着在大多数情况下,我在给定的“解决方案”上工作,直到它不产生任何错误,并至少保存 BlogPost 的属性。这些关系发生的情况各不相同: 通常标记会再次添加到标记表中,并带有新的 PK,保存的 BlogPost 会引用这些 PK,而不是原始的 PK。当然,返回的 Tags 有 PK,在保存/更新方法之前,我检查了 PK,它们与数据库中的 PK 相等,所以 EF 可能认为它们是新对象,而那些 PK 是临时对象。
我知道的一个问题可能会让我们无法找到一个自动化的简单解决方案: 当一个 POCO 对象的集合发生变化时,上面提到的虚拟集合属性就会发生变化,因为这样 FixupCollection 技巧就会更新多对多关系另一端的反向引用。然而,当 View“返回”更新后的 BlogPost 对象时,这种情况并没有发生。这意味着我的问题可能没有简单的解决方案,但这会让我非常难过,我会恨 EF4-POCO-MVC 的胜利:。这也意味着 EF 不能在任何使用 EF4对象类型的 MVC 环境中这样做: (。我认为基于快照的更改跟踪应该会发现,更改后的 BlogPost 与现有的 PK 标记有关系。
顺便说一句: 我认为同样的问题发生在一对多关系(谷歌和我的同事这样说)。我会在家里尝试一下,但即使这样也不能帮助我在我的应用程序的六个多对多的关系: (。