2012年3月28日星期三

从微软的DBML文件中我们能学到什么(它告诉了我们什么是微软的重中之重)~五 LINQ实体类中对属性的赋值,变化前与变化后SendPropertyChanging与SendPropertyChanged

从微软的DBML文件中我们能学到什么(它告诉了我们什么是微软的重中之重)~五 LINQ实体类中对属性的赋值,变化前与变化后SendPropertyChanging与SendPropertyChanged



一 DBContext的构造方法,方法的重载

二 DBContext实例中,表实体对象是怎么被加入的

三 分部类是否破坏了单一职责

四 分部方法从另一方面定义了类型的操作规范

五 LINQ实体类中对属性的赋值,变化前与变化后SendPropertyChanging与SendPropertyChanged

六 LINQTOSQL中为我们触发了SendPropertyChanging和SendPropertyChanged,它的真正用意是什么

七 为DBContext对象应该作为其它实体操作类型的基类,并为它提供统一的提交动作

 

 

首先从这一篇的文章标题中可以看出,主要是讲dbml中对实体的属性赋值的相关知识,还有SendPropertyChanging与SendPropertyChanged这两个方法,从第五讲和第六讲中我们看到标题有些雷同,是的,但我讲它们的侧重点不同,第五讲主要讲实体中属性赋值的过程,此时会用到SendPropertyChanging与SendPropertyChanged这两个方法,而第六讲,主要是讲这两个方法的作用,先透露一下,主要讲事件触发机制的,呵呵。

public string ExceptionID       {           get           {               return this._ExceptionID;           }           set           {               if ((this._ExceptionID != value))               {                   this.OnExceptionIDChanging(value);                   this.SendPropertyChanging();                   this._ExceptionID = value;                   this.SendPropertyChanged("ExceptionID");                   this.OnExceptionIDChanged();               }           }       }

这是一种其中的dbml实体类中的代码片段,它主要是为ExceptionID这个属性赋值,get部分没什么说的,已经返回这个_ExceptionID字段的值,主要看set部分,它的工作流程是:

1 判断_ExceptionID变量是否等于原来的值

2 如果不等,调用OnExceptionIDChanging方法,表示开始修改这字段,它是一个分部方法,可以由开发人员根据自己的逻辑去实现它

3 调用属性将要被修改方法SendPropertyChanging

4 对字段进行赋值

5 调用属性已经被修改方法SendPropertyChanged,并告诉方法修改的字段为“ExceptionID”

6 OnExceptionIDChanged,表示这个字段已经修改完成

 

我们主要看一下SendPropertyChanging和SendPropertyChanged

protected virtual void SendPropertyChanging()      {          if ((this.PropertyChanging != null))          {              this.PropertyChanging(this, emptyChangingEventArgs);          }      }      protected virtual void SendPropertyChanged(String propertyName)      {          if ((this.PropertyChanged != null))          {              this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));          }      }

这两个方法是派生自INotifyPropertyChanging和INotifyPropertyChanged这两个接口的,主要作用是通知客户端某个属性将要被修改和已经被修改,在这两个

方法体中,事实上是实现了触以下两个事件的作用

public event PropertyChangingEventHandler PropertyChanging;   public event PropertyChangedEventHandler PropertyChanged;也就是说,只要属性被修改,那么这两个事实将被触发,那linqtosql为我们提供这个功能有什么作用呢?
请看下集,呵呵。


TAG: