C# 在实体framewok中使用DBcontext更新实体不起作用
我有一个项目,我正在使用一个通过实体数据模型连接的数据库,我正在使用DBcontext创建和更新实体 我的创建方法(如下)运行良好C# 在实体framewok中使用DBcontext更新实体不起作用,c#,entity-framework,C#,Entity Framework,我有一个项目,我正在使用一个通过实体数据模型连接的数据库,我正在使用DBcontext创建和更新实体 我的创建方法(如下)运行良好 [HttpPost] public IHttpActionResult PostCustomer([FromBody] Customer Customer) { if (!ModelState.IsValid) { return BadRequest(ModelState); } using (var dbCtx =
[HttpPost]
public IHttpActionResult PostCustomer([FromBody] Customer Customer)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
using (var dbCtx = new CustomerDBEntities())
{
dbCtx.Customers.Add(Customer);
dbCtx.SaveChanges();
}
return CreatedAtRoute("DefaultApi", new { id = Customer.id }, Customer);
}
但是我的更新方法什么也不做。我没有得到一个错误或任何事情,只是似乎什么也没有发生。它并没有更新这些值。
代码是这样的
[HttpPut]
public IHttpActionResult UpdateCustomer([FromBody] Customer Customer)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
Customer cust;
var ctx = new CustomerDBEntities();
cust = ctx.Customers.Where(s => s.id == Customer.id).FirstOrDefault<Customer>();
if (cust != null)
{
cust.Customer_Name = Customer.Customer_Name;
cust.email = Customer.email;
cust.Customer_address = Customer.Customer_address;
}
ctx.Entry(cust).State = System.Data.EntityState.Modified;
ctx.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = Customer.id }, Customer);
}
[HttpPut]
公共IHttpActionResult UpdateCustomer([FromBody]客户)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
客户客户;
var ctx=新的CustomerBenties();
cust=ctx.Customers.Where(s=>s.id==Customer.id).FirstOrDefault();
if(cust!=null)
{
cust.Customer\u Name=Customer.Customer\u Name;
cust.email=Customer.email;
cust.Customer\u address=Customer.Customer\u address;
}
ctx.Entry(cust.State=System.Data.EntityState.Modified;
ctx.SaveChanges();
返回CreatedAtRoute(“DefaultApi”,新的{id=Customer.id},Customer);
}
当我以前使用SQL命令直接访问数据库时,它工作正常,但自从我更改它之后,它就停止工作了
任何帮助都将不胜感激。在属性级别添加更改
context.Entry(Customer).Property(cust => cust.Customer_Name).IsModified = true;
这里有更多细节
这里也回答了类似的问题删除这行代码
ctx.Entry(cust).State = System.Data.EntityState.Modified;
EF跟踪在上下文中对实体所做的更改,您不需要告诉它它已被修改。如果(cust!=null)可能重复,理想情况下不需要手动设置(
ctx.Entry(cust.State=System.Data.EntityState.modified;
)在同一上下文中获取实体时的实体状态-EF change tracker将为您完成这项工作。但是,设置状态不应该影响任何事情。放置一个try-catch并验证没有错误。同样出于性能考虑,您可以获得类似ctx.Customers.Find(Customer.id)
的实体,而不是ohWhere
和FirstOrDefault
您的代码没有明显的问题(除了更新太多,如注释所示)。你确定你在检查正确的数据库吗?另外,监视执行的SQL。您好,非常感谢您的回复。现在,它对我部分有效。现在,当输入所有字段时,它可以工作,但当电子邮件字段不变时,它不工作。如果名称或地址未更改,则仅当电子邮件字段未更改时才起作用。有什么建议吗?您好,感谢它为我提供的帮助,但现在我遇到了另一个问题,当所有字段都更改或电子邮件字段更改时,它起作用,但当电子邮件未更改时,它仍然失败,如果姓名或地址不变,它仍然有效,只有电子邮件字段现在给我带来了问题。你应该问一个新问题,而不是编辑现有问题并断章取义地呈现所有评论和答案。