实体未使用 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 实体某些字段根据模型状态进行自动更新内容