EF学习笔记——通用增删改查方案
EF学习笔记——通用增删改查方案
我刚接触EF未久,还不知道它有什么强大之处,但看上去,EF提供了一般的增删改查功能。以往用过一些ORM方法,尽管有代码生成器,但代码量总的来说比较多。这次采用EF,我就想,能不能尽量写出一些通用的方法,以后添加表、实体类,只需做很少的改动,就能拥有基本的增删改查功能呢?
方案如下:
1、分为几个部分:BLL、DAL、Model、Interface。其中,EF生成的代码放在Model。因为不想由BLL直接操作Model,因此还是增加一个DAL,由它来对EF的方法作进一步的封装,供BLL调用。至于接口,则是出于如下考虑:增删改查,BLL和DAL都需要实现,因此它们最好实现同一接口;最重要的,因为使用了接口,在BLL中,方便调用DAL对象。
这几个部分分别介绍如下:
1、接口Interface
- public interface IEntity
- {
- long _ID { get;}
- }
public interface IEntity
{
long _ID { get;}
}
- public interface ICommon<T> where T : class,IEntity
- {
- T Add(T model);
- T Update(T model);
- void Delete(T model);
- //按主键删除,keyValues是主键值
- void Delete(params object[] keyValues);
- //keyValues是主键值
- T Find(params object[] keyValues);
- List<T> FindAll();
- }
public interface ICommon<T> where T : class,IEntity
{
T Add(T model);
T Update(T model);
void Delete(T model);
//按主键删除,keyValues是主键值
void Delete(params object[] keyValues);
//keyValues是主键值
T Find(params object[] keyValues);
List<T> FindAll();
}
2、DAL
通用的增删改查代码:
- public abstract class BaseCommon<T> : Interface.ICommon<T> where T : class,Interface.IEntity
- {
- DbContext db;
- public BaseCommon(DbContext context)
- {
- this.db = context;
- }
- public DbContext Context
- {
- get
- {
- return db;
- }
- }
- #region ICommon<T>
- public T Add(T model)
- {
- db.Set<T>().Add(model);
- db.SaveChanges();
- return model;
- }
- public T Update(T model)
- {
- if (db.Entry<T>(model).State == EntityState.Modified)
- {
- db.SaveChanges();
- }
- else if (db.Entry<T>(model).State == EntityState.Detached)
- {
- try
- {
- db.Set<T>().Attach(model);
- db.Entry<T>(model).State = EntityState.Modified;
- }
- catch (InvalidOperationException)
- {
- T old = Find(model._ID);
- db.Entry(old).CurrentValues.SetValues(model);
- }
- db.SaveChanges();
- }
- return model;
- }
- public void Delete(T model)
- {
- db.Set<T>().Remove(model);
- db.SaveChanges();
- }
- public void Delete(params object[] keyValues)
- {
- T model = Find(keyValues);
- if (model != null)
- {
- db.Set<T>().Remove(model);
- db.SaveChanges();
- }
- }
- public T Find(params object[] keyValues)
- {
- return db.Set<T>().Find(keyValues);
- }
- public List<T> FindAll()
- {
- return db.Set<T>().ToList();
- }
- #endregion
- }
public abstract class BaseCommon<T> : Interface.ICommon<T> where T : class,Interface.IEntity
{
DbContext db;
public BaseCommon(DbContext context)
{
this.db = context;
}
public DbContext Context
{
get
{
return db;
}
}
#region ICommon<T>
public T Add(T model)
{
db.Set<T>().Add(model);
db.SaveChanges();
return model;
}
public T Update(T model)
{
if (db.Entry<T>(model).State == EntityState.Modified)
{
db.SaveChanges();
}
else if (db.Entry<T>(model).State == EntityState.Detached)
{
try
{
db.Set<T>().Attach(model);
db.Entry<T>(model).State = EntityState.Modified;
}
catch (InvalidOperationException)
{
T old = Find(model._ID);
db.Entry(old).CurrentValues.SetValues(model);
}
db.SaveChanges();
}
return model;
}
public void Delete(T model)
{
db.Set<T>().Remove(model);
db.SaveChanges();
}
public void Delete(params object[] keyValues)
{
T model = Find(keyValues);
if (model != null)
{
db.Set<T>().Remove(model);
db.SaveChanges();
}
}
public T Find(params object[] keyValues)
{
return db.Set<T>().Find(keyValues);
}
public List<T> FindAll()
{
return db.Set<T>().ToList();
}
#endregion
}
这里面,已经封装好了一般的增删改查方法。而对应数据库每个表对象的那些类,只需继承这个BaseCommon类,即可拥有增删改查功能。如:
- public partial class TableA : BaseCommon<Model.TableA> { }
public partial class TableA : BaseCommon<Model.TableA> { }
这样,TableA对象会自然拥有增删改查功能。假如需要扩充它的功能,我们可以再写一个TableA的分部类。
以后,新增一个表TableB,在DAL这里,一般情况下只需新增一句:
- public partial class TableB : BaseCommon<Model.TableB> { }
public partial class TableB : BaseCommon<Model.TableB> { }
是不是很方便?
3、BLL
BLL是供UI层,或者上一层调用的,因此,它每个对象,也应该有增删改查的基本功能。当然,BLL无须直接实现,是通过调用DAL来实现:
- public abstract class Common<TDAL, TModel> : Interface.ICommon<TModel>
- where TDAL : class ,new()
- where TModel : class ,Interface.IEntity
- {
- protected TDAL dal;
- private Interface.ICommon<TModel> common;
- public Common()
- {
- dal = new TDAL();
- common = (Interface.ICommon<TModel>)dal;
- }
- #region ICommon<TModel>
- public TModel Add(TModel model)
- {
- return common.Add(model);
- }
- public TModel Update(TModel model)
- {
- return common.Update(model);
- }
- public void Delete(TModel model)
- {
- common.Delete(model);
- }
- public void Delete(params object[] keyValues)
- {
- common.Delete(keyValues);
- }
- public TModel Find(params object[] keyValues)
- {
- return common.Find(keyValues);
- }
- public List<TModel> FindAll()
- {
- return common.FindAll();
- }
- #endregion
- }
public abstract class Common<TDAL, TModel> : Interface.ICommon<TModel>
where TDAL : class ,new()
where TModel : class ,Interface.IEntity
{
protected TDAL dal;
private Interface.ICommon<TModel> common;
public Common()
{
dal = new TDAL();
common = (Interface.ICommon<TModel>)dal;
}
#region ICommon<TModel>
public TModel Add(TModel model)
{
return common.Add(model);
}
public TModel Update(TModel model)
{
return common.Update(model);
}
public void Delete(TModel model)
{
common.Delete(model);
}
public void Delete(params object[] keyValues)
{
common.Delete(keyValues);
}
public TModel Find(params object[] keyValues)
{
return common.Find(keyValues);
}
public List<TModel> FindAll()
{
return common.FindAll();
}
#endregion
}
与DAL类似,TableA对象在这里是这样的:
- public partial class TableA : Common<DAL.TableA, Model.TableA> { }
public partial class TableA : Common<DAL.TableA, Model.TableA> { }
同理,如果以后新增了表TalbeB,在这里也只是新增一句而已。
这里还有一个好处,就是对外界调用而言,根本不需要知道泛型,就是一个 TableA table = new TalbeA();就可以了。
========================================================================
使用EF框架的增删改查和分页的公共类
- public class BaseRepository<T> where T : class
- {
- //实例化EF框架
- DataModelContainer db = new DataModelContainer();
- //添加
- public T AddEntities(T entity)
- {
- db.Entry<T>(entity).State = EntityState.Added;
- db.SaveChanges();
- return entity;
- }
- //修改
- public bool UpdateEntities(T entity)
- {
- db.Set<T>().Attach(entity);
- db.Entry<T>(entity).State = EntityState.Modified;
- return db.SaveChanges() > 0;
- }
- //删除
- public bool DeleteEntities(T entity)
- {
- db.Set<T>().Attach(entity);
- db.Entry<T>(entity).State = EntityState.Deleted;
- return db.SaveChanges() > 0;
- }
- //查询
- public IQueryable<T> LoadEntities(Func<T, bool> wherelambda)
- {
- return db.Set<T>().Where<T>(wherelambda).AsQueryable();
- }
- //分页
- public IQueryable<T> LoadPagerEntities<S>(int pageSize, int pageIndex, out int total,
- Func<T, bool> whereLambda, bool isAsc, Func<T, S> orderByLambda)
- {
- var tempData = db.Set<T>().Where<T>(whereLambda);
- total = tempData.Count();
- //排序获取当前页的数据
- if (isAsc)
- {
- tempData = tempData.OrderBy<T, S>(orderByLambda).
- Skip<T>(pageSize * (pageIndex - 1)).
- Take<T>(pageSize).AsQueryable();
- }
- else
- {
- tempData = tempData.OrderByDescending<T, S>(orderByLambda).
- Skip<T>(pageSize * (pageIndex - 1)).
- Take<T>(pageSize).AsQueryable();
- }
- return tempData.AsQueryable();
- }
- }
浙公网安备 33010602011771号