public class EFDao<T> : IDao<T> where T : class
{
private EnergyIotDbContext db;
public EFDao(EnergyIotDbContext _db)
{
db = _db;
}
public async Task<bool> Add(T Entity)
{
//老写法
//db.Entry(Entity).State = EntityState.Added;
await db.Set<T>().AddAsync(Entity);
return await db.SaveChangesAsync() > 0;
}
public async Task<bool> Delete(T Entity)
{
//老写法
//db.Set<T>().Attach(Entity);
//db.Entry(Entity).State = EntityState.Deleted;
//新写法
db.Set<T>().Remove(Entity);
return await db.SaveChangesAsync() > 0;
}
public async Task<bool> Update(T Entity)
{
//老写法
//db.Set<T>().Attach(Entity);
//db.Entry(Entity).State = EntityState.Modified;
//新写法
db.Set<T>().Update(Entity);
return await db.SaveChangesAsync() > 0;
}
public IEnumerable<T> GetEntities(Expression<Func<T, bool>> exp)
{
//var data = db.Set<T>().Find()
return CompileQuery(exp);
}
public IEnumerable<T> GetEntitiesForPaging(int Page, int pageSize, Expression<Func<T, bool>> exp)
{
return CompileQuery(exp).Skip((Page - 1) * pageSize).Take(pageSize);
}
public T GetEntity(Expression<Func<T, bool>> exp)
{
return CompileQuerySingle(exp);
}
private IEnumerable<T> CompileQuery(Expression<Func<T, bool>> exp)
{
var func = EF.CompileQuery((EnergyIotDbContext context, Expression<Func<T, bool>> exps) => context.Set<T>().Where(exp));
return func(db, exp);
}
private T CompileQuerySingle(Expression<Func<T, bool>> exp)
{
var func = EF.CompileQuery((EnergyIotDbContext context, Expression<Func<T, bool>> exps) => context.Set<T>().FirstOrDefault(exp));
return func(db, exp);
}
}
很久以前分享过ef4.0 5.0的写法 但是在efcore里更简单了不需要跟踪实体状态了我们可以F12看下他定义的方法
我们可以看到 Add Update Remove 方法使用起来更简单灵活了