我遇到一个问题,生成的Ria Services实体中的PropertyChanged事件没有为所有属性引发。
当我查看生成的代码(客户端)时,我可以看到我的实体是从实现INotifyPropertyChanged的Entity对象派生的。我还可以看到,一些属性,如Id属性,正在引发PropertyChanged事件,但有些属性没有。
我没有使用任何T4模板,所以使用了默认模板。
所以,我的问题是:
是否有可以设置的选项/属性,以便为生成的客户端实体的任何属性引发PropertyChanged事件?
如有任何帮助,我们将不胜感激。
编辑:
以下是自动生成的客户端文件中的属性示例,不会引发PropertyChanged事件:
[DataMember()]
[Required()]
[StringLength(50)]
public string FirstName
{
get
{
return this._firstName;
}
set
{
if ((this._firstName != value))
{
this.OnFirstNameChanging(value);
this.RaiseDataMemberChanging("FirstName");
this.ValidateProperty("FirstName", value);
this._firstName = value;
this.RaiseDataMemberChanged("FirstName");
this.OnFirstNameChanged();
}
}
}
这就是服务器端模型中定义的:
[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
[DataMemberAttribute()]
public global::System.String FirstName
{
get
{
return _FirstName;
}
set
{
OnFirstNameChanging(value);
ReportPropertyChanging("FirstName");
_FirstName = StructuralObject.SetValidValue(value, false);
ReportPropertyChanged("FirstName");
OnFirstNameChanged();
}
}
以下是自动生成的客户端文件中的属性示例,会引发PropertyChanged事件:
[DataMember()]
[Editable(false, AllowInitialValue=true)]
[Key()]
[RoundtripOriginal()]
public Guid Id
{
get
{
return this._id;
}
set
{
if ((this._id != value))
{
this.OnIdChanging(value);
this.ValidateProperty("Id", value);
this._id = value;
this.RaisePropertyChanged("Id");
this.OnIdChanged();
}
}
}
这就是服务器端模型中定义的:
[EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
[DataMemberAttribute()]
public global::System.Guid Id
{
get
{
return _Id;
}
set
{
if (_Id != value)
{
OnIdChanging(value);
ReportPropertyChanging("Id");
_Id = StructuralObject.SetValidValue(value);
ReportPropertyChanged("Id");
OnIdChanged();
}
}
}
PropertyChanged事件封装在RaiseDataMemberChanged()中。你可以用任何解压缩程序(.NET反射器等)来检查这一点。
RaiseDataMemberChanged和RaiseDataMemberChanging方法用于通知框架有关更改跟踪和状态转换的更改。
这两个属性不同,因为Id属性是用Key属性修饰的。我认为,由于与其他实体的关联,以及不同的自动生成实现,具有此属性的属性会得到特殊的处理,因为不需要跟踪更改或转换更改。
因此,在您的情况下,我认为还有另一个问题,为什么您的PropertyChanged事件(可能)没有被激发。