【问题标题】:Entity Framework: Create an entity, attach child entities, do some stuff then persist entities... how?实体框架:创建一个实体,附加子实体,做一些事情然后持久化实体......如何?
【发布时间】:2010-09-16 08:19:46
【问题描述】:

我有一个函数,我想返回一个新实体,其中已经附加了一些子实体。我不想做的是首先在数据库中创建它们。我只想创建一个新的实体实例,创建一些新的子实体并将它们添加到父实体,然后在函数中返回父实体。

我从这段代码开始;

    public BusinessEntities.Event CreateEventWithDefaultActions(EventType eventType)
    {
        Facades.Event eventFacade = new Facades.Event();
        IList<BusinessEntities.DefaultAction> defaultActions;

        // new event
        BusinessEntities.Event skeletonEvent = new BusinessEntities.Event();
        skeletonEvent.EventType = eventType;

        // load the default actions
        defaultActions = eventFacade.LoadDefaultActionTypes(eventType);

        // create a new action and attach to the event
        foreach (BusinessEntities.DefaultAction defaultAction in defaultActions)
        {
            BusinessEntities.Action action = new BusinessEntities.Action();

            if(!defaultAction.ActionTypeReference.IsLoaded)
                defaultAction.ActionTypeReference.Load();

            action.ActionType = defaultAction.ActionType;                
            skeletonEvent.Actions.Attach(action);  // exception thrown
        }

        return skeletonEvent;
    }

本质上,我正在创建一个新的事件实体,它可以具有关联的动作实体 - 然后尝试根据它们的类型加载一些动作并将动作实体附加到事件实体。当这行代码skeletonEvent.Actions.Attach(action);执行时抛出以下异常;

当与此相关端关联的源对象处于添加、删除或分离状态时,附加操作无效。使用 NoTracking 合并选项加载的对象始终是分离的。

我哪里错了?

【问题讨论】:

    标签: c# .net entity-framework


    【解决方案1】:

    也许您应该尝试使用 Add 方法而不是 Attach。当对象上下文跟踪两个实体时,应使用附加。您可能必须使用 AddObject(或生成的 AddToEvent)方法将 Event 对象添加到 ObjectContext。

    【讨论】:

    • 我不希望任何一个对象被上下文跟踪,我希望它们从上下文中分离出来,这样它们就可以由函数返回而没有关系。当需要保存时,另一个函数将处理附加。
    • 使用 .Add() 方法会引发不同的错误;无法将该对象添加到 EntityCollection 或 EntityReference。无法将附加到 ObjectContext 的对象添加到不与源对象关联的 EntityCollection 或 EntityReference。
    • 如果我理解正确的话,可能你想在某个层(客户端)构建对象图,然后将其提交给服务层进行持久化。您或许应该使用 EF4 中的 POCO 实体 - 请参阅本文 (msdn.microsoft.com/en-us/magazine/ee335715.aspx) 了解 POCO 可用的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 2019-03-13
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    相关资源
    最近更新 更多