利用entity framework修改SQL数据库中数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用entity framework修改SQL数据库中数据相关的知识,希望对你有一定的参考价值。
利用entity framework修改SQL数据库中数据时,是不是必须把表中所有字段都修改一下,否则该条数据其他字段自动变为空?如何修改表中某行的单个字段,而其他值不受影想。例如student 中有字段 ID,Name,Sex,Age,现在若用entity至修改name值时(只写user.Name=text.box1.text;然后 schoolDB.Student.Attach(user); )虽然Name修改成功,可Sex,和Age却都变成了NULL。
参考技术A 修改之前先取得
DB中的值
然后把
你取得的值
负值到ENTITY里边
修改的时候只是修改当前你要修改的
就可以了
但是会有一个悲观锁的问题发生:
也就是当你取得DB
的值
往ENTITY里放完后,进行修改再更新,这一过程中
有可能
别人在这个时候
把其他的字段给更新了
那么
你就同时把别人的操作给覆盖了,
这个悲观锁的问题有前提条件
才能发生,就是是否有很多人同时操作这个表
利用Entity Framework修改指定字段中的值
利用Entity Framework修改指定字段中的值一般我们编辑某些模型的时候会用到类似这样的代码:
[HttpPost] public ActionResult Edit(Article model) { if (model.Id == 0) { return HttpNotFound(); } using (db) { db.Entry(model).State = EntityState.Modified; db.SaveChanges(); } return RedirectToAction("Index"); }
这样的代码完全能够符合我们的要求,能够顺利的修改我们想要修改的数据。
但是其中却有一个问题:例如说文章的创建时间字段Create_Time
是由文章创建的时候生成的,其值不应该随着文章的编辑而变化,为了使这个值不变,我们就需要在前台的html代码里加上一个隐藏的name属性为Create_Time的input并且设置其值为文章的创建时间。这样做也能成功但是不保险,如果编辑人员有能力修改input里的值的话还是能够修改数据库中的数据的。所以我们应该从代码的层面上来解决这个问题。
再举个例子,用户在修改密码的时候我们只希望单单的修改密码字段,而不需要将原来的用户模型全都加载进来,然后再修改密码,再保存。这样做感觉上是已经多走了好多的路。
而如果我们直接手写sql语句的话我们可以直接执行SQL语句:
update userinfo set password = ‘123456‘
很显然如果我们类似使用dbContext的执行sql语句就有点本末倒置了:
db.Database.ExecuteSqlCommand("update userinfo set password = ‘123456‘");
解决办法
使用类似下列代码:也就是只设置模型的某些特定的字段来告诉EF我们希望修改哪些字段。
public ActionResult TestEdit(int id=0) { var model = new Article {Id = id, Title = $"after edit!current time: {DateTime.Now}"}; db.Article.Attach(model); db.Entry(model).Property(x => x.Title).IsModified = true; db.SaveChanges(); return RedirectToAction("Index"); }
上述代码只修改了文章的标题,而其他字段并没有做任何的修改,整个修改过程也没涉及到任何的读取数据库操作。这样的修改显然要更加合理。
以上是关于利用entity framework修改SQL数据库中数据的主要内容,如果未能解决你的问题,请参考以下文章
MVC5 Entity Framework学习之Entity Framework高级功能
.NET Entity Framework 与复制的 SQL 服务器一起使用