EF學習筆記——通用增刪改查方案
阿新 • • 發佈:2018-11-09
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!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();就可以了。