【问题标题】:Entity Framework - Add reference to child object without retrieving entire list of objects?实体框架 - 添加对子对象的引用而不检索整个对象列表?
【发布时间】:2010-12-08 15:48:22
【问题描述】:

我的父对象具有 childs 属性,它本身就是一个集合对象。 IE。 Parent.Childs 我通过 WCF 公开这些 EF 对象。换句话说,父母可以有多个孩子,例如 Invoice(parent) 和 LineItems (childs)。

客户端我如何引用 Child 对象并将其添加到 Childs 集合中,而无需通过服务并获取整个子项列表并为每个匹配的子对象手动设置 Parent.Childs.Add(child)。

我想做类似 Parent.Childs = new Childs(){ new Child{childId=1}, new Child{childId=2}};然后当我将 Parent 发送到服务器时,服务器知道 id=1 和 id=2 的孩子已经存在并将其连接起来。我确定已经离开了。

我正在阅读有关 EntityKey 属性的信息,但我的对象客户端根本没有此属性。

谢谢

【问题讨论】:

    标签: entity-framework entity


    【解决方案1】:
    using(var context = new MyEntities())
    {
        var child1 = new Child{ childId = 1 };
        context.Children.Attach(child1);
        var parent = new Parent();
        parent.Children.Add(child1);
        context.SaveChanges();
    }
    

    【讨论】:

    • 我正在使用带有实体对象的 wcf 服务,因此客户端没有任何诸如“上下文”之类的东西
    • 我曾经尝试过这个解决方案并不断收到“ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象”我不知道应该如何解决这个问题。 ..有什么想法吗?
    • @SimonDugré,这是一个重复键错误。您需要更新已加载的对象,而不是尝试添加具有相同键的新对象。
    【解决方案2】:

    在从数据库加载实体之前,服务器不知道实体是否存在。因此,当您在客户端添加子节点并将它们发送到服务器时,您还必须包含有关新子节点、更新子节点和已删除子节点的信息。如果您不包含此类信息,则必须先从数据库加载完整的实体图,然后将接收到的图与加载的图进行比较并手动处理更改。

    这种情况的自动解决方案可以是自我跟踪实体 (STE),但您的示例仍然不起作用。 STE 要求您加载对象、将它们发送给客户端、修改它们并将它们发回。 STE 将跟踪所有更改。

    【讨论】:

    • 我正在使用 STE,目前我必须从服务器获取所有子节点,然后在客户端添加它们,即 parent.children.add(child)(其中 child 是我从服务器收到的一个)。听起来这是使用 STE 执行此操作的唯一方法(这是正确的吗?)看到已经有一个 id 为 1 的孩子,不要创建一个新的。
    猜你喜欢
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多