相关疑难解决方法(0)

保存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万
查看次数

更新对象图时实体框架的断开行为

我目前正在使用一个使用以下技术的项目.

  1. ASP.net MVC - 表示层
  2. 数据服务层 - (WCF)
  3. 具有自动映射器的数据传输对象(DTO)层
  4. 域层(POCO,代码优先实体框架)
  5. 存储库层+实体框架4.3 + DbContext.

我们使用DTO使用自动映射器转换Domain对象,并使用WCF服务发送到前端.

此外,我们在WCF层为每个请求创建基于请求的DBContext,并且我们的WCF服务上下文由客户端DTO中的Per Call和No Tracking启用构建,并且它完全断开连接.

我们还有以下对象图.

public class User : BaseEntity
    {
        public virtual Identity Identity { get; set; }

        public string UserName { get; set; }

        public string Password { get; set; }

        public int IdentityId { get; set; }

        public virtual IList<Group> Groups{ get; set; }
    }



 public class Identity : BaseEntity
    {
        public string FirstName { get; set; }

        public string LastName { get; set; …
Run Code Online (Sandbox Code Playgroud)

wcf disconnected-environment entity-framework-4.1 asp.net-mvc-3

2
推荐指数
2
解决办法
3778
查看次数