故如虹,知恩;故如月,知明
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
欢迎加群交流技术

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

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

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

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

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

完整一点的代码:

public int Update<T>(T t) where T : class
    {
        var userm = efcontext.Entry<T>(t);
        //把user对象加入上下文,但是没有改变
        userm.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)
            {
                //检测当前字段是否是主键
                var keys = userm.Property(item.Name).Metadata.GetType().GetProperty("Keys");
                object value = keys.GetValue(userm.Property(item.Name).Metadata);
                //不是主键才去修改,如果是主键就不需要修改了
                if (value == null)
                {
                    //表示该字段需要更新
                    userm.Property(item.Name).IsModified = true;
                }
            }
        }
        return efcontext.SaveChanges();
    }

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

public int Update<T>(T t, string keyName) where T : class
{
    var userm = efcontext.Entry<T>(t);
    //把user对象加入上下文,但是没有改变
    userm.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)
            {
                //表示该字段需要更新
                userm.Property(item.Name).IsModified = true;
            }
        }
    }
    return efcontext.SaveChanges();
}

使用的时候这样既可:

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



欢迎加群讨论技术,群:677373950(满了,可以加,但通过不了),2群:656732739

评价