zoukankan      html  css  js  c++  java
  • Asp.Net MVC EF之二:原生EF插入,更新数据的正确方法

    引言

    EF是相对与Dapper、NHibernate官方首推的ORM框架,其在开发过程中的方便,快捷毋庸置疑的,但由于EF本身的一些缓存机制、跟踪机制,所以在使用时有些地方需要特别注意。

    下面我将自己在项目中的总结的一些经验 分享出来,希望能帮助大家正确的使用EF。

    正文

    1. 插入数据

    不建议的做法:

    dbcontext.entity.Add(_entity); 
    
    dbcontext.SaveChanges();
    

    正确的做法:

    dbcontext.Entry<TEntity>(entity).State = EntityState.Added;
    dbcontext.SaveChanges();
    

    .SaveChanges() 会返回一个受影响条数的Int值

    2. 更新数据

    不建议的做法:

    var entity = dbcontext.Set<TEntity>().FirstOrDefault(predicate); //predicate表示唯一查询的Lambda表达式,当参数查询不唯一时,次表达式只会取第一条
    
    entity.t_Name = "张三2";
    dbcontext.SaveChanges();
    

    注意:此种做法 必须将主键传递进来重新查询一遍,防止与其他加了.AsNoTracking()的方法混用,.AsNoTracking()的作用是放弃对EF对象的跟踪,这样对属性进行重新赋值后,调用.SaveChanges()将会失效。

    正确的做法:

    var entity = dbcontext.Set<TEntity>().Single(predicate); //predicate表示唯一查询的Lambda表达式,当参数查询不唯一时,将会报错
    entity.t_Name = "张三2";
    dbcontext.Set<TEntity>().Attach(entity);
    dbcontext.Entry(entity).Property(a => a.t_Name).IsModified = true; //将EF对t_Name的管理状态设置为是一个更新
    dbcontext.SaveChanges();
    

    上面的做法必将导致如果要改多个字段,就必须重复的对IsModified进行设置。

    我们进一步对修改方法做一个封装,封装方法如下:

            public int Update(TEntity entity)
            {
                dbcontext.Set<TEntity>().Attach(entity);
                PropertyInfo[] props = entity.GetType().GetProperties();
                foreach (PropertyInfo prop in props)
                {
                    if (prop.GetValue(entity, null) != null)
                    {
                        if (prop.GetValue(entity, null).ToString() == " ")
                            dbcontext.Entry(entity).Property(prop.Name).CurrentValue = null;
                        dbcontext.Entry(entity).Property(prop.Name).IsModified = true;
                    }
                }
                return dbcontext.SaveChanges();
            }

    TEntity:表示一个泛型类,对泛型类还不了解的朋友可以百度一下泛型类或者阅读这篇文章 C#中泛型类,泛型方法,泛型约束实际应用 补一补。

    之后我会出一篇对EF处理机制的详细介绍,提供给大家参考,也是对自己知识经验的一个总结!

  • 相关阅读:
    MySQL数据类型与操作
    MySQL 初识
    python中的线程
    python中的进程
    python中基于tcp协议与udp的通信(数据传输)
    字符串str.format()方法的个人整理
    进度条打印函数
    套接字错误搜集
    正则表达式 整理(w s d 点 贪婪匹配 非贪婪匹配 * + ? {} | [] ^ $  单词边界 分组、re.findall()、re.split()、re.search()、re.match()、re.compile()、re.sub())
    软件开发架构介绍||OSI七层协议之物理层、数据链路层、网络层、传输层(mac地址、ip协议、断开协议、tcp协议之三次握手四次挥手)
  • 原文地址:https://www.cnblogs.com/ydcnblog/p/9533357.html
Copyright © 2011-2022 走看看