实体框架 - 更新实体但不更新子实体

时间:2015-06-09 12:45:42

标签: entity-framework entity-framework-6

在我的EF 6 MVC应用程序中,我有一个与SellerShippingPolicies有1:1关系的实体卖家。当我更新卖方实体时,EF也在尝试更新SellerShippingPolicies实体,我不希望这种情况发生。

我有以下更新卖方实体的方法:

    public Entities.Seller Save(Entities.Seller seller)
    {
        // Instantiate a helper method
        HelperMethods helper = new HelperMethods(this.UnitOfWork);

        // Map the domain entity to an EF entity
        var sellerRecord = Mapper.Map<Seller>(seller);

        // Attempt to prevent the updating of the SellerShippingPolicies entity
        helper.GetDbContext().Entry(sellerRecord.SellerShippingPolicies).State = EntityState.Detached;

        // Save the entity
        sellerRecord = helper.SaveItem<Seller>(sellerRecord);
    }

以下是调用的SaveItem方法:

    public T SaveItem(T entity)
    {
        var row = this._dbSet.Find(GetPrimaryKeyValue(entity));
        if ( row == null )
            return AddItem(entity);
        else
            return UpdateItem(entity);
    }

最终被调用的Update方法:

    public T UpdateItem(T entity)
    {
        // Retrieve the current copy of the entity to be updated.
        var currentEntity = GetItem(GetPrimaryKeyValue(entity));

        // Copy the contents of the modified entity on top of the copy we just retrieved. This way EF will save everything correctly.
        currentEntity = Copy.ShallowCopy<T>(entity, currentEntity);

        this._dbContext.SaveChanges();

        return currentEntity;
    }

不确定是否有必要,但这是ShallowCopy和GetItem的方法。

    public static T ShallowCopy<T>(object source, T target)
    {
        foreach (PropertyInfo pi in typeof(T).GetProperties())
        {
            var property = source.GetType().GetProperty(pi.Name);

            if (property == null)
                continue;

            if (property.GetSetMethod() != null)
                property.SetValue(target, pi.GetValue(source, null), null);
        }
        return target;
    }

    public T GetItem(object primaryKeyValue)
    {
        return this._dbSet.Find(primaryKeyValue);
    }

所有这些方法共享相同的上下文对象。

您可以看到我试图通过将其状态设置为已分离来阻止更新SellerShippingPolicies实体。这不起作用。我也尝试将状态设置为Unchanged。这也不起作用。在这两种情况下,EF都会尝试更新SellerShippingPolicies实体。我错过了什么?

0 个答案:

没有答案