從微(wei)軟(ruan)的DBML文件(jian)中我(wo)們能學到(dao)什么(me)(它告(gao)訴了(le)我(wo)們什么(me)是微(wei)軟(ruan)的重(zhong)中之重(zhong))~二 DBContext實例中,表實體對象是怎么(me)被加入的
五 LINQ實體類中對屬性的賦值,變化前與變化后SendPropertyChanging與SendPropertyChanged
六 LINQTOSQL中為我們觸發了SendPropertyChanging和SendPropertyChanged,它的真正用意是什么
七 為DBContext對象應該作為其它實體操作類型的基類,并為它提供統一的提交動作
這個系(xi)列的主角將(jiang)一直(zhi)是(shi)linqtosql.dbml,我們(men)一般叫它數據(ju)對(dui)象(xiang)關系(xi)映射(she),或者稱為(wei)ORM,簡單說(shuo)就(jiu)(jiu)是(shi)數據(ju)庫與對(dui)象(xiang)之(zhi)間(jian)作一個關系(xi),這種關系(xi)我們(men)稱為(wei)Mapping,在LinqToSQL中(zhong),我們(men)直(zhi)接(jie)(jie)將(jiang)某個數據(ju)庫對(dui)象(xiang)托到DBML文件中(zhong),這種關系(xi)映射(she)就(jiu)(jiu)形(xing)成了,也(ye)就(jiu)(jiu)是(shi)說(shuo),以(yi)后想操(cao)作數據(ju)庫直(zhi)接(jie)(jie)操(cao)作DBML中(zhong)的實體類型(xing)就(jiu)(jiu)可以(yi)了。
我們在使(shi)用(yong)某種ORM工具時,總有一個(ge)習慣,那就是(shi)將需要(yao)抽(chou)(chou)象(xiang)(xiang)的(de)東(dong)西(xi)進行(xing)抽(chou)(chou)象(xiang)(xiang),因(yin)為(wei)在管(guan)理起來比較方便,結構(gou)上也更符合面向對(dui)象(xiang)(xiang),對(dui)面LinqToSQL的(de)實(shi)體(ti)類,我們是(shi)否(fou)應該把它進行(xing)一個(ge)抽(chou)(chou)象(xiang)(xiang)?其實(shi),微(wei)軟(ruan)在設計LinqToSQL實(shi)體(ti)類時已經(jing)把答案告(gao)訴了我們,那就是(shi)“要(yao),必須要(yao)”,從實(shi)體(ti)類型用(yong)partial修飾符就可(ke)(ke)以看出,微(wei)軟(ruan)很(hen)希望(wang)我們把它重新(xin)進行(xing)一行(xing)抽(chou)(chou)象(xiang)(xiang),將自己項(xiang)目(mu)需要(yao)的(de)東(dong)西(xi)加入(ru)到實(shi)體(ti)類中(zhong)(zhong),在項(xiang)目(mu)中(zhong)(zhong),代(dai)碼(ma)可(ke)(ke)能是(shi)這樣(yang):
1 /// <summary> 2 /// 用戶(hu)實體 4 /// </summary> 5 public partial class UserBases : EntityBase 6 { 7 /// <summary> 8 /// 統一(yi)主鍵(jian) 9 /// </summary> 10 protected override object[] PrimaryKey 11 { 12 get { return new object[] { this.UserID }; } 13 } 14 15 /// <summary> 16 /// 字段(duan)變(bian)化 17 /// </summary> 18 public override void OnPropertyChange() 19 { 20 if (this.IsValid)//實(shi)體是否驗證通過 21 22 { 23 base.OnLoaded(); 24 this.PropertyChanged += new PropertyChangedEventHandler(base.PropertyChangedEvent); 25 } 26 } 27 }
在UserBases實體中由于它繼承了EntityBase這個統一的實體抽象類,所以,在DATA層作統一實體GURD操作時,方法參數和返回值可以寫成這樣:
1 protected virtual IQueryable<EntityBase> GetEntities<TEntity>(Expression<Func<TEntity, bool>> queryFunc) where TEntity : EntityBase 2 { 3 }
對于實體的抽象,不僅是LinqToSQL,對于其實的架構也同樣適用。