中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

從微(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)交動作

一 DBContext的構造方法,方法的重載

二 DBContext實例中,表實體對象是怎么被加入的

三 分部類是否破壞了單一職責

四 分部方法從另一方面定義了類型的操作規范

五 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的重中之重等等,非常感謝您的閱讀,如果有問題,請給我留言!!!
posted @ 2012-03-30 23:06  張占嶺  閱讀(1191)  評論(2)    收藏  舉報