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应用程序中的View)。稍后,我会收到已更改属性和更改关系的更新后的BlogPost。例如,它具有标签“A”“B”和“C”,新标签为“C”和“D”。在我的特定示例中,没有新标签,标签的属性也从未更改,因此应保存的是更改的关系。现在,我需要将其保存在另一个ObjectContext中。(更新:现在我尝试在同一个上下文实例中执行并失败了。)
问题:我无法正确保存关系。我尝试了所有我能找到的方法:
- Controller.UpdateModel和Controller.TryUpdateModel不起作用。 - 从上下文中获取旧的BlogPost,然后修改集合不起作用。(使用来自下一个点的不同方法) - This可能有效,但我希望这只是一个解决方法,而不是解决方案:(。 - 尝试了每种可能组合的BlogPost和/或Tags的Attach/Add/ChangeObjectState函数。失败了。 - This看起来就是我需要的,但它不起作用(我尝试修复它,但对于我的问题无法做到)。 - 尝试更改上下文的关系对象的ChangeState/Add/Attach/...。失败了。
"Doesn't work"通常意味着我已经针对给定的“解决方案”进行了工作,直到它产生没有错误并至少保存了BlogPost的属性。与关系的发生情况各不相同:通常标签会再次添加到标签表中,并具有新的PK,保存的BlogPost引用这些标签而不是原始标签。当然,返回的标签具有PK,并且在保存/更新方法之前,我检查了PK,它们等于数据库中的PK,所以EF可能认为它们是新对象,并且这些PK是临时的。
我知道一个问题,可能会使找到自动简单的解决方案变得不可能:当POCO对象的集合发生更改时,应该通过上述提到的虚拟集合属性来完成,因为这样FixupCollection技巧将更新许多对多关系另一端的反向引用。但是,当视图“返回”已更新的BlogPost对象时,这种情况并未发生。这意味着也许没有简单的解决方案来解决我的问题,但这会让我非常难过,我会讨厌EF4-POCO-MVC的胜利:(。此外,这意味着EF无论使用哪种EF4对象类型,在MVC环境中都无法执行此操作:(。我认为基于快照的更改跟踪应该发现已更改的BlogPost与具有现有PK的标签存在关系。
顺便说一句:我认为同样的问题也会在一对多关系中发生(Google和我的同事这么说)。我会在家里试一试,但即使这样做可以解决问题,在我的应用程序中的六个多对多关系中也没有帮助我:(。"