1. 程式人生 > >EF學習筆記——通用增刪改查方案

EF學習筆記——通用增刪改查方案

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

我剛接觸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 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    }

這裡面,已經封裝好了一般的增刪改查方法。而對應資料庫每個表物件的那些類,只需繼承這個BaseCommon類,即可擁有增刪改查功能。如:

public partial class TableA : BaseCommon<Model.TableA> { }

這樣,TableA物件會自然擁有增刪改查功能。假如需要擴充它的功能,我們可以再寫一個TableA的分部類。

以後,新增一個表TableB,在DAL這裡,一般情況下只需新增一句:

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    }

與DAL類似,TableA物件在這裡是這樣的:

public partial class TableA : Common<DAL.TableA, Model.TableA> { }

同理,如果以後新增了表TalbeB,在這裡也只是新增一句而已。


這裡還有一個好處,就是對外界呼叫而言,根本不需要知道泛型,就是一個 TableA table = new TalbeA();就可以了。


           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述