小编pet*_*ldi的帖子

保存EF4 POCO对象的更改时更新关系

实体框架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;
Run Code Online (Sandbox Code Playgroud)

我要求一个BlogPost和来自ObjectContext实例的相关标签,并将其发送到另一层(MVC应用程序中的View).稍后我回到更新的BlogPost,更改了属性并更改了关系.例如,它具有标签"A""B"和"C",并且新标签是"C"和"D".在我的特定示例中,没有新的标签,并且标签的属性永远不会改变,因此唯一应该保存的是改变的关系.现在我需要将它保存在另一个ObjectContext中.(更新:现在我尝试在同一个上下文实例中执行,但也失败了.)

问题:我无法正确保存关系.我尝试了我发现的一切:

  • Controller.UpdateModel和Controller.TryUpdateModel不起作用.
  • 从上下文中获取旧的BlogPost然后修改集合不起作用.(从下一点开始采用不同的方法)
  • 可能会起作用,但我希望这只是一种解决方法,而不是解决方案:(.
  • 尝试在每种可能的组合中为BlogPost和/或Tags执行Attach/Add/ChangeObjectState函数.失败.
  • 看起来像我需要的,但它不起作用(我试图解决它,但不能解决我的问题).
  • 尝试ChangeState/Add/Attach/...上下文的关系对象.失败.

"不起作用"意味着在大多数情况下我使用给定的"解决方案",直到它不产生错误并至少保存BlogPost的属性.关系会发生什么变化:通常使用新的PK将标签添加到Tag表中,并且保存的BlogPost引用那些而不是原始的.当然返回的标签有PK,在保存/更新方法之前,我检查PK并且它们等于数据库中的PK,所以EF可能认为它们是新对象而那些PK是临时的.

我知道的一个问题,并且可能使得无法找到自动化的简单解决方案:当POCO对象的集合发生更改时,应该通过上面提到的虚拟集合属性发生,因为那时FixupCollection技巧将更新另一端的反向引用多对多关系.但是,当View"返回"更新的BlogPost对象时,这种情况并未发生.这意味着对我的问题可能没有简单的解决方案,但这会让我非常伤心,我会讨厌EF4-POCO-MVC的胜利:(.这也意味着EF无法在MVC环境中做到这一点,无论哪个使用EF4对象类型:(.我认为基于快照的更改跟踪应该发现更改的BlogPost与具有现有PK的标签有关系.

顺便说一句:我认为同一个问题发生在一对多的关系上(谷歌和我的同事这么说).我会在家里尝试一下,但即使这样做对我的应用程序中的六个多对多关系没有帮助:(.

asp.net-mvc poco entity-framework-4

107
推荐指数
4
解决办法
3万
查看次数

标签 统计

asp.net-mvc ×1

entity-framework-4 ×1

poco ×1