实体框架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,然后修改集合不起作用。(从下一点开始采用不同的方法)
- 这可能会起作用,但是我希望这只是一种解决方法,而不是解决方案:(。
- 在每种可能的组合中尝试了BlogPost和/或标签的Attach / Add / ChangeObjectState函数。失败了
- 这看起来像我所需要的,但是不起作用(我试图修复它,但是不能解决我的问题)。
- 尝试过ChangeState / Add / Attach / ...上下文的关系对象。失败了
在大多数情况下,“无效”表示我使用给定的“解决方案”,直到它不产生错误并至少保存BlogPost的属性为止。关系发生的情况各不相同:通常,标记会使用新的PK再次添加到Tag表中,并且保存的BlogPost会引用这些PK,而不引用原始的PK。当然,返回的Tag具有PK,在保存/更新方法之前,我检查了PK,它们等于数据库中的PK,因此EF可能认为它们是新对象,而这些PK是临时对象。
我知道的一个问题,可能无法找到一个自动化的简单解决方案:当更改POCO对象的集合时,上述虚拟集合属性应该会发生这种情况,因为FixupCollection技巧将在另一端更新反向引用多对多关系。但是,当视图“返回”更新的BlogPost对象时,则没有发生。这意味着可能没有简单的解决方案可以解决我的问题,但这会让我非常难过,我会讨厌EF4-POCO-MVC的胜利:(。这也意味着EF在任何MVC环境中都无法做到这一点使用EF4对象类型:(。我认为基于快照的更改跟踪应发现更改的BlogPost与具有现有PK的标签具有关系。
顺便说一句:我认为一对多关系也会发生同样的问题(谷歌和我的同事也这么说)。我会在家里尝试一下,但是即使该方法无法解决我的应用程序中的六个多对多关系:(。