使用EntityState.Modified更新记录但插入新行而不是更新

时间:2016-01-31 06:14:25

标签: c# entity-framework-6

我正在使用EF6,在此我试图通过使用EntityState.Modified状态来更新数据库中的现有记录,但是它在表中插入新行而不是更新它。我使用以下代码请让我知道我哪里出错了。

public Product UpdateProduct(ProductVM objProduct)
{
    Product obj = new Product();
    obj = JsonConvert.DeserializeObject<Product>(JsonConvert.SerializeObject(objProduct));
    DbContext.Entry(obj).State = EntityState.Modified;
    DbContext.SaveChanges();
    return obj;
}

1 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为实体框架“不知道”您的这个实体。你只是传递一个视图模型,即使你知道它有PK或FK,EF也不知道该做什么,所以它创建了一个新模型。看到您创建了new Product()?这一行创建了一个新产品,因为它是新产品,EF会将其状态视为已添加。

相反,您需要首先从DB获取对象然后更改字段。像这样:

public Product UpdateProduct(ProductVM objProduct)
{
    obj = JsonConvert.DeserializeObject<Product>(JsonConvert.SerializeObject(objProduct));

    //Get the product from DB to update
    var product = DbContext.SingleOrDefult(x => x.Id == objProduct.Id);

    //update fields...
    product.SomeField = obj.SomeField;

    //Save changes
    DbContext.Entry(product).State = EntityState.Modified;
    DbContext.SaveChanges();

    return product;
}

如果此产品具有其他表的外键,您应该检查此问题并回答:

Difference between updating an entity by using a foreign key and using the navigation properties In Entity Framework

相关问题