C#中泛型类,泛型方法,泛型约束实际应用
程序员文章站
2022-03-26 10:19:33
Asp.Net MVC EF之二:原生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处理机制的详细介绍,提供给大家参考,也是对自己知识经验的一个总结!