实体未使用 Entity Framework 6 在数据库中更新

Posted

技术标签:

【中文标题】实体未使用 Entity Framework 6 在数据库中更新【英文标题】:Entity not updating in database using Entity Framework 6 【发布时间】:2021-03-11 01:27:08 【问题描述】:

我正在为我的 Xamarin android 应用程序创建一个 API,并且我已经创建了这个方法来更新数据库中的密码:

[HttpPut]
[ActionName("updatepassword")]
public HttpResponseMessage updatepassword(string password,string email)

    user_table user = dbe.user_table
                         .Where(x => x.email_address == email)
                         .FirstOrDefault();
    user.password_hash = password.GetHashCode();

    var response = dbe.SaveChanges();
    string finalresponse = "password updated successfully" + response;

    return Request.CreateResponse(HttpStatusCode.OK, finalresponse );

但是当我使用邮递员对其进行测试时,它显示有 0 个实体受到了影响。

我也尝试过使用

dbe.user_table.AddorUpdate()

但它也不起作用,请帮助我。

这是我的邮递员查询

http://192.168.10.9:8044/api/account/updatepassword/?password=asad1234&email=asadregards@gmail.com

我已经在 IIS 服务器上发布了我的 API,这就是我使用 IP 地址而不是 localhost 的原因。

【问题讨论】:

@marc_s 你应该在编辑我的问题后回答我的问题 可能实体的状态没有改变。你试过用EntityStates吗? 如果有明显的答案,我会发布的。唯一明显的是,在调用.FirstOrDefault() 之后,您应该始终检查NULL,然后再进行任何进一步操作:if (user != null) ...... - 否则您可能会尝试设置password_hash 并结束加上NullReferenceException EF 说实体在您调用SaveChanges之前处于哪个状态?检查dbe.ChangeTracker.Entries() @AsadUllah 不要指望奇迹,至少不会来自我们,当发布没有明显错误并且您没有提供任何细节的代码时,例如您在调试时看到的内容. 【参考方案1】:

将您的代码更改为:

var user = dbe.user_table
            .Where(x => x.email_address == email)
             .FirstOrDefault();

var response=0;
if (user!=null)

   user.password_hash = password.GetHashCode();
 dbe.Entry(user).State = EntityState.Modified;

// Or you can try 
//dbe.Entry(user).Property(i => i.password_hash).IsModified = true;

    response = dbe.SaveChanges();

 
........
........

也许更改 API 标头也是个好主意:

[Route("updatepassword/password/email")]
public  IHttpActionResult updatepassword(string password,string email)

.........
.......
return response>0 ? Ok():BadRequest();


【讨论】:

不清楚为什么将整个user 对象标记为Modified 会解决这个问题。它的效率较低,因为在原始代码中只有 user.password_hash 应该被标记为已修改和更新。如果原始代码不起作用,则没有理由相信这个答案会真正解决问题。 如您所知,数据库不能只更新一个字段。它总是更新整条记录,有时甚至整页记录。 数据库更新的物理方面在这里无关紧要。 逻辑上只需要更新一个字段。这里最重要的是问题没有得到澄清。如果它现在有效,可能是因为他们改变的不仅仅是这个。 我做了一些改变。请检查我的答案。

以上是关于实体未使用 Entity Framework 6 在数据库中更新的主要内容,如果未能解决你的问题,请参考以下文章

使用 Entity Framework 6 将父实体与数据库中现有的子实体连接起来

《Entity Framework 6 Recipes》中文翻译系列 (13) -----第三章 查询之使用Entity SQL

在 Entity Framework 6 中保存分离的实体

Entity Framework 6 实体某些字段根据模型状态进行自动更新内容

《Entity Framework 6 Recipes》翻译系列 -----第一章 开始使用实体框架之使用介绍 (转)

Entity Framework 6 从同一个实体对象创建两个表