我正在使用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;
}
答案 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;
}
如果此产品具有其他表的外键,您应该检查此问题并回答: