C# 在实体framewok中使用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 =

我有一个项目,我正在使用一个通过实体数据模型连接的数据库,我正在使用DBcontext创建和更新实体

我的创建方法(如下)运行良好

[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)
的实体,而不是oh
Where
FirstOrDefault
您的代码没有明显的问题(除了更新太多,如注释所示)。你确定你在检查正确的数据库吗?另外,监视执行的SQL。您好,非常感谢您的回复。现在,它对我部分有效。现在,当输入所有字段时,它可以工作,但当电子邮件字段不变时,它不工作。如果名称或地址未更改,则仅当电子邮件字段未更改时才起作用。有什么建议吗?您好,感谢它为我提供的帮助,但现在我遇到了另一个问题,当所有字段都更改或电子邮件字段更改时,它起作用,但当电子邮件未更改时,它仍然失败,如果姓名或地址不变,它仍然有效,只有电子邮件字段现在给我带来了问题。你应该问一个新问题,而不是编辑现有问题并断章取义地呈现所有评论和答案。