引言
EF是相对与Dapper、NHibernate官方首推的ORM框架,其在开发过程中的方便,快捷毋庸置疑的,但由于EF本身的一些缓存机制、跟踪机制,所以在使用时有些地方需要特别注意。
下面我将自己在项目中的总结的一些经验 分享出来,希望能帮助大家正确的使用EF。
正文
1. 插入数据
不建议的做法:
1
2
3
|
dbcontext.entity.Add(_entity);
dbcontext.SaveChanges();
|
正确的做法:
1
2
|
dbcontext.Entry<TEntity>(entity).State = EntityState.Added;
dbcontext.SaveChanges();
|
.SaveChanges() 会返回一个受影响条数的Int值
2. 更新数据
不建议的做法:
1
2
3
4
|
var
entity = dbcontext.Set<TEntity>().FirstOrDefault(predicate);
//predicate表示唯一查询的Lambda表达式,当参数查询不唯一时,次表达式只会取第一条
entity.t_Name =
"张三2"
;
dbcontext.SaveChanges();
|
注意:此种做法 必须将主键传递进来重新查询一遍,防止与其他加了.AsNoTracking()的方法混用,.AsNoTracking()的作用是放弃对EF对象的跟踪,这样对属性进行重新赋值后,调用.SaveChanges()将会失效。
正确的做法:
1
2
3
4
5
|
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进行设置。
我们进一步对修改方法做一个封装,封装方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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处理机制的详细介绍,提供给大家参考,也是对自己知识经验的一个总结!