首页 > 代码库 > EF学习笔记——通用增删改查方案

EF学习笔记——通用增删改查方案

        EF学习笔记——通用增删改查方案             

        分类:             .NET             EF             

我刚接触EF未久,还不知道它有什么强大之处,但看上去,EF提供了一般的增删改查功能。以往用过一些ORM方法,尽管有代码生成器,但代码量总的来说比较多。这次采用EF,我就想,能不能尽量写出一些通用的方法,以后添加表、实体类,只需做很少的改动,就能拥有基本的增删改查功能呢?

方案如下:

1、分为几个部分:BLL、DAL、Model、Interface。其中,EF生成的代码放在Model。因为不想由BLL直接操作Model,因此还是增加一个DAL,由它来对EF的方法作进一步的封装,供BLL调用。至于接口,则是出于如下考虑:增删改查,BLL和DAL都需要实现,因此它们最好实现同一接口;最重要的,因为使用了接口,在BLL中,方便调用DAL对象。

 

这几个部分分别介绍如下:

1、接口Interface

 

[csharp] view plaincopyprint?技术分享技术分享
  1. public interface IEntity  
  2. {  
  3.     long _ID { get;}  
  4. }  
    public interface IEntity    {        long _ID { get;}    }
[csharp] view plaincopyprint?技术分享技术分享
  1. public interface ICommon<T> where T : class,IEntity  
  2. {  
  3.     T Add(T model);  
  4.     T Update(T model);  
  5.     void Delete(T model);  
  6.     //按主键删除,keyValues是主键值  
  7.     void Delete(params object[] keyValues);  
  8.     //keyValues是主键值  
  9.     T Find(params object[] keyValues);  
  10.     List<T> FindAll();  
  11. }  
    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

通用的增删改查代码:

 

[csharp] view plaincopyprint?技术分享技术分享
  1. public abstract class BaseCommon<T> : Interface.ICommon<T> where T : class,Interface.IEntity  
  2. {  
  3.     DbContext db;  
  4.     public BaseCommon(DbContext context)  
  5.     {  
  6.         this.db = context;  
  7.     }  
  8.   
  9.     public DbContext Context  
  10.     {  
  11.         get  
  12.         {  
  13.             return db;  
  14.         }  
  15.     }  
  16.  
  17.     #region ICommon<T>  
  18.     public T Add(T model)  
  19.     {  
  20.         db.Set<T>().Add(model);  
  21.         db.SaveChanges();  
  22.         return model;  
  23.     }  
  24.     public T Update(T model)  
  25.     {  
  26.         if (db.Entry<T>(model).State == EntityState.Modified)  
  27.         {  
  28.             db.SaveChanges();  
  29.         }  
  30.         else if (db.Entry<T>(model).State == EntityState.Detached)  
  31.         {  
  32.             try  
  33.             {  
  34.                 db.Set<T>().Attach(model);  
  35.                 db.Entry<T>(model).State = EntityState.Modified;  
  36.             }  
  37.             catch (InvalidOperationException)  
  38.             {  
  39.                 T old = Find(model._ID);  
  40.                 db.Entry(old).CurrentValues.SetValues(model);  
  41.             }  
  42.             db.SaveChanges();  
  43.         }  
  44.         return model;  
  45.     }  
  46.     public void Delete(T model)  
  47.     {  
  48.         db.Set<T>().Remove(model);  
  49.         db.SaveChanges();  
  50.     }  
  51.     public void Delete(params object[] keyValues)  
  52.     {  
  53.         T model = Find(keyValues);  
  54.         if (model != null)  
  55.         {  
  56.             db.Set<T>().Remove(model);  
  57.             db.SaveChanges();  
  58.         }  
  59.     }  
  60.     public T Find(params object[] keyValues)  
  61.     {  
  62.         return db.Set<T>().Find(keyValues);  
  63.     }  
  64.     public List<T> FindAll()  
  65.     {  
  66.         return db.Set<T>().ToList();  
  67.     }  
  68.     #endregion  
  69. }  
    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类,即可拥有增删改查功能。如:

 

 

[csharp] view plaincopyprint?技术分享技术分享
  1. public partial class TableA : BaseCommon<Model.TableA> { }  
public partial class TableA : BaseCommon<Model.TableA> { }
这样,TableA对象会自然拥有增删改查功能。假如需要扩充它的功能,我们可以再写一个TableA的分部类。

 

以后,新增一个表TableB,在DAL这里,一般情况下只需新增一句:

 

[csharp] view plaincopyprint?技术分享技术分享
  1. public partial class TableB : BaseCommon<Model.TableB> { }  
public partial class TableB : BaseCommon<Model.TableB> { }
是不是很方便?

 

3、BLL

BLL是供UI层,或者上一层调用的,因此,它每个对象,也应该有增删改查的基本功能。当然,BLL无须直接实现,是通过调用DAL来实现:

 

[csharp] view plaincopyprint?技术分享技术分享
  1. public abstract class Common<TDAL, TModel> : Interface.ICommon<TModel>  
  2.         where TDAL : class ,new()  
  3.         where TModel : class ,Interface.IEntity   
  4.     {  
  5.         protected TDAL dal;  
  6.         private Interface.ICommon<TModel> common;  
  7.   
  8.         public Common()  
  9.         {  
  10.             dal = new TDAL();  
  11.             common = (Interface.ICommon<TModel>)dal;  
  12.         }  
  13.  
  14.         #region ICommon<TModel>  
  15.         public TModel Add(TModel model)  
  16.         {  
  17.             return common.Add(model);  
  18.         }  
  19.         public TModel Update(TModel model)  
  20.         {  
  21.             return common.Update(model);  
  22.         }  
  23.         public void Delete(TModel model)  
  24.         {  
  25.             common.Delete(model);  
  26.         }  
  27.         public void Delete(params object[] keyValues)  
  28.         {  
  29.             common.Delete(keyValues);  
  30.         }  
  31.         public TModel Find(params object[] keyValues)  
  32.         {  
  33.             return common.Find(keyValues);  
  34.         }  
  35.         public List<TModel> FindAll()  
  36.         {  
  37.             return common.FindAll();  
  38.         }  
  39.         #endregion  
  40.     }  
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对象在这里是这样的:

 

 

[csharp] view plaincopyprint?技术分享技术分享
  1. public partial class TableA : Common<DAL.TableA, Model.TableA> { }  
public partial class TableA : Common<DAL.TableA, Model.TableA> { }
同理,如果以后新增了表TalbeB,在这里也只是新增一句而已。

 

 

这里还有一个好处,就是对外界调用而言,根本不需要知道泛型,就是一个 TableA table = new TalbeA();就可以了。

EF学习笔记——通用增删改查方案