将现有但已修改的实体附加到上下文

时间:2012-01-04 09:40:30

标签: asp.net-mvc entity-framework

在我的模型中,我有两个类别和产品。他们之间存在多种关系。

我手动修改所有类别的状态,当我在saveChanges()之前在调试器中观看时,我看到所有这些类别都被标记为已修改。但是在我的数据库中没有更新类别和产品之间的请求映射之后。更新代码功能。

public void UpdateProduct(Product product) 
    {
        using (EFDbContext context = new EFDbContext())
        {
            context.Products.Attach(product);
            if (product.Categories != null)
            {
                foreach (var item in product.Categories)
                {
                    context.Entry(item).State = EntityState.Modified;
                }
            }
            context.Entry(product).State = EntityState.Modified;

            context.SaveChanges();
        }
    }

1 个答案:

答案 0 :(得分:2)

将实体设置为已修改,表示您已更改其属性(不是导航属性),并且您希望保存它们。如果您通过例如在现有产品和类别之间创建新关系或删除现有产品和类别设置状态之间的关系来更改关系(导航属性)将无法帮助您。这实际上是very hard to solve(在所有当前的EF版本中都是相同的)因为该关系有自己的状态,必须设置,关系状态不能是Modified =你必须知道你是否添加或删除了关系。特别是删除很难,因为当您要将实体附加到上下文时,您可能没有关于从Categories导航属性中删除的关系的信息。此外DbContext doesn't offer access to state of the relation因此您必须将其转换为ObjectContext并使用ObjectStateManager

解决此问题的最简单方法是在保存之前从数据库加载带有类别的产品,并使用加载的附加图形手动同步分离的对象图(此时您要保存的对象图)。同步附加图形中的所有更改后,您将其保存回数据库。附图将知道添加或删除了与类别的关系。