如何更新实体和多对多关系

时间:2016-03-29 23:18:18

标签: c# entity-framework

我尝试以这种方式更新实体,但我收到有关Keys的错误。

我想知道如何在参数或方法内部获取实体产品的关系。我认为是解决方案。

public static bool UpdateProduct( Product myProduct , int[] newCategoriesID )
{
    bool operation = false;
    using ( var ctx = new TestContext() )
    {
        ctx.Entry( myProduct ).State = EntityState.Modified;
        var newCategories = ctx.Categories.Where( c => newCategoriesID.Contains( c.id ) ).ToList();
        myProduct.Categories.Clear();
        foreach ( var newCat in newCategories )
        {
            myProduct.Categories.Add( newCat );
        }
        ctx.Products.Attach( myProduct );
        int countChanges = ctx.SaveChanges();
        if ( countChanges > 0 )
        {
            operation = true;
        }
    }
    return operation;
}

我使用的是ASP.NET MVC 5和最新版本的Entity Framework。

1 个答案:

答案 0 :(得分:0)

此解决方案有效,但我不知道它是否正常

public static bool UpdateProduct( Product myProduct , int[] newCategoriesID )
    {
        bool operation = false;
        using ( var ctx = new TestContext() )
        {
//find the product in the database and include the relation
            var existeproduct = ctx.Products.Include("Categories").SingleOrDefault(x=>x.id == myProduct.id);
// Change the current and original values by copying the values from other objects
            ctx.Entry( existeproduct ).CurrentValues.SetValues(myProduct);
            ctx.Entry( existeproduct ).State = EntityState.Modified;
            var newCategories = ctx.Categories.Where( c => newCategoriesID.Contains( c.id ) ).ToList();
            existeproduct.Categories.Clear();
            foreach ( var newCat in newCategories )
            {
                existeproduct.Categories.Add( newCat );
            }
            int countChanges = ctx.SaveChanges();
            if ( countChanges > 0 )
            {
                operation = true;
            }
        }
        return operation;
    }