原
EF多种更新方法。EF修改,Entity Framework修改。abp vnext ef 更新封装

方法1:直接执行更新的sql语句
过于简单不说了
方法2:先查询在更新
Users result = oapEntities.Users.Where(a => a.Id == users.Id).FirstOrDefault();
result.UserName = users.UserName;
result.Number = users.Number;
result.UClass = users.UClass;
result.CheckType = users.CheckType;
需要查询一次效率不是太友好
方法3:不用查询直接更新
//标识整个对象的状态为修改(他会把里边所有的字段都标识为修改,这个适合修改一个表的所有字段)
oapEntities.Entry(users).State = System.Data.Entity.EntityState.Modified;
方法4:不用查询(不用查询一次效率会提高一些),而且也可以指明需要修改的字段
//先要把实体添加到上下文当中(实体需要在上下文中才能做操作,否则会报错:实体不在上下文中)
oapEntities.Users.Attach(users);
var entry = oapEntities.Entry(users);
entry.Property("UserName").IsModified = true;//指明用户名这个字段是因为被修改的
entry.Property("Number").IsModified = true;
entry.Property("UClass").IsModified = true;
entry.Property("CheckType").IsModified = true;
方法5:封装通用的不查询更新需要字段的方法
public int Update(T t, string keyName)
{
var entry = context.Entry<T>(t);
//把user对象加入上下文,并且是没有改变的状态
entry.State = Microsoft.EntityFrameworkCore.EntityState.Unchanged;
//使用反射找到不为空的字段
foreach (var item in t.GetType().GetProperties())
{
//虚拟属性是导航属性
if (item.GetMethod.IsVirtual)
{
continue;
}
//拿到属性值
object obj = item.GetValue(t);
if (obj != null)
{
//不是主键才去修改,如果是主键就不需要修改了
if (item.Name != keyName)
{
//表示该字段需要更新
entry.Property(item.Name).IsModified = true;
}
}
}
return context.SaveChanges();
}
ef core检查某个字段是否是主键:
https://www.tnblog.net/aojiancc2/article/details/3278
abp vnext ef 更新封装
更新指定的字段:
/// <summary>
/// 更新指定的字段
/// </summary>
/// <param name="entity"></param>
/// <param name="fields"></param>
/// <returns></returns>
public async Task<int> UpdateAsync(TEntity entity, List<string> fields)
{
if (entity == null || fields == null || fields.Count == 0)
return 0;
var db = await GetDbContextAsync();
db.Set<TEntity>().Attach(entity);
foreach (var item in fields)
{
db.Entry(entity).Property(item).IsModified = true;
}
return await db.SaveChangesAsync();
}
更新实体,所有字段会被标记为修改
使用该方法建议先查询出来在给需要修改的字段赋值。当然修改之前通常会先查询一次,比如验证数据是否存在,数据所有权等,不能把别人的数据更新了撒。
/// <summary>
/// 更新实体
/// 所有字段会被标记为修改,使用该方法建议先查询出来在修改需要的字段。当然修改之前通常会先查询一次,需要验证数据是否存在,数据所有权等。
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<int> UpdateAsync(TEntity entity)
{
if (entity == null)
throw new NullReferenceException("更新对象不能为空");
var getDbContext = await GetDbContextAsync();
getDbContext.Entry(entity).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
return await getDbContext.SaveChangesAsync();
}
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)
评价
排名
8
文章
221
粉丝
7
评论
7
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256


欢迎加群交流技术
TeachingNote
自顶![[熊猫]](https://www.tnblog.net/layui/images/face/50.gif)
是伍尚金哇_v
感谢大佬分享