從微(wei)軟的DBML文件中(zhong)(zhong)我(wo)們(men)能學(xue)到什么(它告訴了我(wo)們(men)什么是微(wei)軟的重(zhong)中(zhong)(zhong)之重(zhong))~七 為(wei)DBContext對象應該作為(wei)其它實體(ti)操作類(lei)型(xing)的基類(lei),并(bing)為(wei)它提(ti)供統一的提(ti)交動作
五 LINQ實體類中對屬性的賦值,變化前與變化后SendPropertyChanging與SendPropertyChanged
六 LINQTOSQL中為我們觸發了SendPropertyChanging和SendPropertyChanged,它的真正用意是什么
七 為DBContext對象應該作為其它實體操作類型的基類,并為它提供統一的提交動作
這是(shi)DBML系(xi)列的最后一(yi)講(jiang),主(zhu)要內(nei)容是(shi)將DBML文(wen)件進行(xing)抽(chou)象,把DBML里(li)所有(you)實體(ti)類進行(xing)一(yi)個抽(chou)象,并為這個抽(chou)象提供必要的屬性和(he)增,刪,改,查等方(fang)法供它的實體(ti)操作對象使用。
今天(tian)講的內(nei)容(rong)都發生在(zai)DATA層(ceng)(DAL層(ceng)),它是對(dui)(dui)Entity層(ceng)的數(shu)據庫進行操作,在(zai)數(shu)據庫操作對(dui)(dui)象(xiang)中有一(yi)個(ge)基(ji)類對(dui)(dui)象(xiang),它為其它操作類提供一(yi)個(ge)DBContext的對(dui)(dui)象(xiang),一(yi)個(ge)SubmitChanges提交方法,及一(yi)系列對(dui)(dui)實體的CURD操作。
結構如下:
對于數據(ju)操作對象的基類,最近我把它(ta)抽象出來,作為(wei)單獨的項目,因為(wei)它(ta)與(yu)具(ju)體的數據(ju)庫(ku)沒有關系,對于所有項目都是通用的。
我們的基類(lei)就是RepositoryBase,看一下它的結構
它(ta)對外界提供一(yi)個(ge)代參(can)數的構(gou)架方(fang)法,就是說,外部繼承它(ta)的,必須要實現這個(ge)有一(yi)個(ge)參(can)數的構(gou)造(zao)方(fang)法才行,主要功能是建立一(yi)個(ge)具體的DBContext對象。
而SubmitChanges就是LINQ TO SQL默認的數(shu)據操作所使用的統一提交方法,它(ta)將捕(bu)捉(zhuo)到所有的并(bing)發沖突,并(bing)進(jin)行相應的處理
1 protected virtual void SubmitChanges() 2 { 3 ChangeSet cSet = DB.GetChangeSet(); 4 if (cSet.Inserts.Count > 0 5 || cSet.Updates.Count > 0 6 || cSet.Deletes.Count > 0) 7 { 8 try 9 { 10 DB.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict); 11 } 12 catch (System.Data.Linq.ChangeConflictException ex) 13 { 14 foreach (System.Data.Linq.ObjectChangeConflict occ in DB.ChangeConflicts) 15 { 16 occ.Resolve(System.Data.Linq.RefreshMode.OverwriteCurrentValues); 17 occ.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues); 18 occ.Resolve(System.Data.Linq.RefreshMode.KeepChanges); 19 } 20 DB.SubmitChanges(); 21 } 22 } 23 } 24 25 //在(zai)Get Entity and MetaTable代碼(ma)段(duan)中,主(zhu)要是得(de)到(dao)簡(jian)單(dan)的實體(ti)結果集和(he)根據主(zhu)鍵獲(huo)得(de)一個實體(ti)對(dui)象的操作 26 27 protected virtual TEntity Find<TEntity>(params object[] keyValues) where TEntity : class 28 { 29 var mapping = DB.Mapping.GetTable(typeof(TEntity)); 30 var keys = mapping.RowType.IdentityMembers.Select((m, i) => m.Name + " = @" + i).ToArray(); 31 TEntity entityTEntity = DB.GetTable<TEntity>().Where(String.Join(" && ", keys), keyValues).FirstOrDefault(); 32 if (entityTEntity != null) 33 DB.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, entityTEntity); 34 return entityTEntity; 35 36 } 37 protected virtual IQueryable<TEntity> GetEntities<TEntity>(Expression<Func<TEntity, bool>> queryFunc) where TEntity : class 38 { 39 Debug.Assert(queryFunc != null, "expression passed in is null"); 40 var results = DB.GetTable<TEntity>().Where(queryFunc); 41 return results; 42 } 43 protected virtual IQueryable<TEntity> GetEntities<TEntity>() where TEntity : class 44 45 { 46 return DB.GetTable<TEntity>(); 47 }
接下(xia)來(lai),就是(shi)Delete,Insert,Update代碼段,它的功能(neng)就是(shi)對數據表進行增(zeng),刪,改等操作
有了這個(ge)(ge)基類,在進行某個(ge)(ge)實體的CURD操作時,只(zhi)需要(yao)繼承它一(yi)下,然后根據自己的邏輯去實現就可以了,例如(ru):
1 public class UserRepository : TESTRepositoryBase, IUserRepository 2 { 3 4 #region IUserRepository 成員 5 public void RegisterUser(Entity.TEST.UserBases entity) 6 { 7 base.InsertEntity(entity); 8 } 9 public void UpdateUser(UserBases entity) 10 { 11 DB.SubmitChanges(); 12 } 13 14 #endregion 15 16 #region IRepository<UserBases> 成é員± 17 18 public void Update(UserBases entity) 19 { 20 base.UpdateEntity(entity); 21 } 22 23 public void Update(IList<UserBases> list) 24 { 25 list.ToList().ForEach(entity => { this.Update(entity); }); 26 } 27 28 public void Insert(UserBases entity) 29 { 30 base.InsertEntity(entity); 31 } 32 33 public void Insert(IList<UserBases> list) 34 { 35 list.ToList().ForEach(entity => { this.Insert(entity); }); 36 } 37 38 public UserBases InsertGetIDENTITY(UserBases entity) 39 { 40 base.InsertEntity(entity); 41 return base.Find<UserBases>(entity.UserID); 42 } 43 44 public void Delete(UserBases entity) 45 { 46 base.DeleteEntity(entity); 47 } 48 49 public void Delete(IList<UserBases> list) 50 { 51 list.ToList().ForEach(entity => { this.Delete(entity); }); 52 } 53 54 public IQueryable<UserBases> GetModel() 55 { 56 return base.GetEntities<UserBases>(); 57 } 58 59 public UserBases Find(params object[] keyValues) 60 { 61 return base.Find<UserBases>(keyValues); 62 } 63 64 #endregion 65 }
這個用戶操作底層就寫好了,它可以有自己的操作邏輯,相當它也必須實現最基礎的操作方法,這個最基礎的操作規定,是由接口IRepository來決定的。
我們用七講來學習了LINQ TO SQL,其主線就是DBML文件,在學習過程中也講了一些.net的基礎知識及.NET的重中之重等等,非常感謝您的閱讀,如果有問題,請給我留言!!!