应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

ef core检查某个字段是否是主键,ef不查询更新

7576人阅读 2020/2/28 11:40 总访问:5194830 评论:0 收藏:0 手机
分类: EF

使用反射检查ef中某个字段是否是主键,使用如下代码即可

  1. //检测当前字段是否是主键
  2. var keys = userm.Property(item.Name).Metadata.GetType().GetProperty("Keys");
  3. object value = keys.GetValue(userm.Property(item.Name).Metadata);

可以用于在封装不需要查询直接更新的时候用,因为如果是主键设置IsModified=true就会报错

完整一点的代码:

  1. public int Update<T>(T t) where T : class
  2.     {
  3.         var userm = efcontext.Entry<T>(t);
  4.         //把user对象加入上下文,但是没有改变
  5.         userm.State = Microsoft.EntityFrameworkCore.EntityState.Unchanged;
  6.         //使用反射找到不为空的字段
  7.         foreach (var item in t.GetType().GetProperties())
  8.         {
  9.             //虚拟属性是导航属性
  10.             if (item.GetMethod.IsVirtual)
  11.             {
  12.                 continue;
  13.             }
  14.             //拿到属性值
  15.             object obj = item.GetValue(t);
  16.             if (obj != null)
  17.             {
  18.                 //检测当前字段是否是主键
  19.                 var keys = userm.Property(item.Name).Metadata.GetType().GetProperty("Keys");
  20.                 object value = keys.GetValue(userm.Property(item.Name).Metadata);
  21.                 //不是主键才去修改,如果是主键就不需要修改了
  22.                 if (value == null)
  23.                 {
  24.                     //表示该字段需要更新
  25.                     userm.Property(item.Name).IsModified = true;
  26.                 }
  27.             }
  28.         }
  29.         return efcontext.SaveChanges();
  30.     }

其实可以多传递一个忽略的字段比如主键,不然的话,每次去反射检查很浪费效率的还不如重新查询一次了

  1. public int Update<T>(T t, string keyName) where T : class
  2. {
  3.     var userm = efcontext.Entry<T>(t);
  4.     //把user对象加入上下文,但是没有改变
  5.     userm.State = Microsoft.EntityFrameworkCore.EntityState.Unchanged;
  6.     //使用反射找到不为空的字段
  7.     foreach (var item in t.GetType().GetProperties())
  8.     {
  9.         //虚拟属性是导航属性
  10.         if (item.GetMethod.IsVirtual)
  11.         {
  12.             continue;
  13.         }
  14.         //拿到属性值
  15.         object obj = item.GetValue(t);
  16.         if (obj != null)
  17.         {
  18.             //不是主键才去修改,如果是主键就不需要修改了
  19.             if (item.Name != keyName)
  20.             {
  21.                 //表示该字段需要更新
  22.                 userm.Property(item.Name).IsModified = true;
  23.             }
  24.         }
  25.     }
  26.     return efcontext.SaveChanges();
  27. }

使用的时候这样既可:

  1. public int UpdateAtricle(Article article)
  2. {
  3.     return _efHelper.Update(article, "Id");
  4. }



欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

ef core上下文对象在异步情况下被自动释放的问题。Cannot access a disposed object. A common cause of this error is disposing a context that was resolved

我们看看下面的代码:这里为了节省效率,更新缓存的操作放到了异步中去执行,但是执行到Article findArticle = _articleDAL...

ef ef core 使用原生 SQL 查询

有时候在执行一个赋值一点的sql要动态生成用lamdba来写很不方便,新版本用动态生成表达式树的方式也不怎么行了...需要时间...

ef core 公共接口封装

show me code: public interface ICommonDAL&lt;T&gt; where T : class, new() { protected EFContex...

ef core 简介

Entity Framework Core 简介 今天来讲解一下 .NET 中的重要成员 Entity Framework Core。Entity Framework Core (以下简...

ef core异步方式读取与返回数据

我们这里可以使用异步的方式来读取与返回数据publicasyncTask&lt;IActionResult&gt;Index() { returnView(await_context....

ef core 多对多

EF 6.x 支持多对多关系的隐式联接表,但 EF Core 不支持。有关详细信息,请参阅:https://github.com/dotnet/efcore/issues...

ef core创建组合主键

使用modelBuilder.Entity&lt;Type&gt;().HasKey指定多个字段即可protectedoverridevoidOnModelCreating(ModelBuildermodelB...

ef core 预先加载显式加载延迟加载

预先加载读取该实体时,会同时检索相关数据。 此时通常会出现单一联接查询,检索所有必需数据。 可使用 Include 和 ThenInc...

ef core 级联删除

和以前的写法有点不同现在没有modelBuilder.Conventions这种用法了,单独开启级联删除的方法也和以前不太一样以前的写法:p...

ef core SqlSugarFreeSqlDapper EF 对比

EF Core优点:微软官方ORM功能强大,支持模式多文档齐全缺点:1.复杂查询生成的SQL语句性能太差(对操作功力要求高)2.一些...

ef core中使用IDesignTimeDbContextFactory的测试方法,调试方法

DesignTimeDbContextFactory的作用 一些EF Core Tools命令(例如Migrations命令)需要在设计时创建一个派生的DbContext实例...

abp vnext连接mysql。.net core连接mysql。ef core连接mysql

增加一个MySQL的库:Volo.Abp.EntityFrameworkCore.MySQL &lt;PackageReference Include=&quot;Volo.Abp.EntityFrameworkCo...

abp vnext ef core连接MySql报空引用错,连接SqlServer报空引用错。abp vnext 的坑

使用abp vnext 真的太喜欢报空引用的错了。你报点错给一点具体的错不行么,这样搞起让人去猜太坑了,比如前面的auto_fac没...

ef core code first 忽略映射数据库字段NotMapped

ef core code first 忽略映射数据库字段非常简单使用NotMapped特性即可。 [NotMapped] public string Status { get; set;...

abp vnext 通用仓储 ef core。WhereIf,多条件,动态条件,分页,动态排序等

abp vnext 通用仓储 ef core WhereIf,多条件,分页等public async Task&lt;List&lt;LandInfoDto&gt;&gt; GetListAsync(Pag...