ComplexObject 类

所有复杂对象的基类。

命名空间: System.ServiceModel.DomainServices.Client
程序集: System.ServiceModel.DomainServices.Client(在 system.servicemodel.domainservices.client.dll 中)

用法

用法
Dim instance As ComplexObject

语法

声明
<DataContractAttribute> _
Public MustInherit Class ComplexObject
    Implements INotifyPropertyChanged, IEditableObject, INotifyDataErrorInfo
[DataContractAttribute] 
public abstract class ComplexObject : INotifyPropertyChanged, IEditableObject, INotifyDataErrorInfo
[DataContractAttribute] 
public ref class ComplexObject abstract : INotifyPropertyChanged, IEditableObject, INotifyDataErrorInfo
/** @attribute DataContractAttribute() */ 
public abstract class ComplexObject implements INotifyPropertyChanged, IEditableObject, 
    INotifyDataErrorInfo
DataContractAttribute 
public abstract class ComplexObject implements INotifyPropertyChanged, IEditableObject, 
    INotifyDataErrorInfo

备注

WCF RIA Services 中的复杂对象类型是可像基类型那样使用的结构化自定义用户类型。框架为复杂类型提供了大量类似于实体的功能(例如富客户端代码生成),而且复杂类型的很多框架行为与实体的行为完全相同或非常类似。但是 ComplexObject 在许多重要方面与 Entity 不同。特别是,复杂类型没有标识。这就意味着,它们没有用 KeyAttribute 标记的成员。因此,客户端不能像对待实体那样为这些复杂类型执行标识缓存。不能从多个父实例中共享或引用复杂类型,且复杂类型不支持继承。

假定您具有一个包含 Address 类型的成员的实体类型 Customer

public class Address
{
    public string AddressLine1 { get;set }
    public string City { get;set }
    public string Region { get;set }
    public string PostalCode { get;set }
    public string Country { get;set }
}

public class Customer
{
    [Key]
    public string CustomerID { get;set; }
    public string CompanyName { get;set }
    public string ContactName { get;set }

    public Address HomeAddress { get;set; }
}

这些类型将导致对应生成的客户端类型:

public class Address : ComplexObject
{
    public string AddressLine1 { . . . }
    public string City { . . . }
    public string Region { . . . }
    public string PostalCode { . . . }
    public string Country { . . . }
}

public class Customer : Entity
{
    [Key]
    public string CustomerID { . . . }
    public string CompanyName { . . . }
    public string ContactName { . . . }

    public Address HomeAddress { . . . }
}

注意,AddressComplexObject 派生。

代码生成

为复杂类型生成的客户端代理与为实体生成的客户端代理非常相似。这包括部分扩展性方法、验证元数据等等。代码生成的复杂类型从 ComplexObject 基类派生。为复杂类型成员生成的属性 setter 逻辑和复杂类型的成员遵从用于实体的相同属性模式。

元数据

与实体一样,您可以通过合作者类向服务器上的复杂类型应用其他元数据,这些元数据将在整个系统中流动。同样地,在您使用支持复杂类型的数据访问层 (DAL) 场合,仍将应用 DAL 元数据(例如,基于您的实体框架模型为成员推断 StringLengthAttribute)。复杂类型参与元数据管道的方式与实体相同。

验证

针对复杂类型成员执行的属性 setter 验证与针对实体成员执行的方式相同。另外,嵌套的复杂类型成员的验证错误会在包含层次结构中向上传播。在实体复杂类型成员对应的两个层上均会执行深度提交时间验证。在所有情况下,嵌套的验证错误将作为层次结构中每个父级的错误报告。例如,如果 Customer.ContactInfo.HomeAddress.PostalCode 成员无效,则验证错误将以 CustomerContactInfoHomeAddress 实例的验证错误的形式出现。将在每个级别对 ValidationResult 中的成员名称进行适当地路径传送。

更改跟踪

单一实例实体复杂类型成员(例如 Customer.Address)完全参与到更改跟踪和 Accept/RejectChanges 管道的其余部分。当嵌套的复杂类型成员发生更改时,这些更改将按包含层次结构向上报告,从而更新父实体。如果在实体上拒绝这些更改,则将还原所有嵌套的复杂类型更改。从概念上讲,系统对待嵌套的复杂类型成员的方式与对待顶级非复杂类型实体属性的方式相同。

将不会深入跟踪集合成员中的复杂类型(例如,Customer.PhoneNumbers)。将在提交时对它们进行深入验证,但由于在集合中的复杂类型实例上设置了成员,因此在实体上不会引发验证错误,并且,父实体不会跟踪集合中的实例是否已进行过修改、添加或删除。若要修改某个复杂类型集合成员的内容,必须向该成员分配一个新的集合实例。

编辑会话

实体复杂类型成员完全参与到通过 IEditableObject 接口启动的实体编辑会话。如果对某个实体执行 BeginEdit,则该实体的状态快照以递归方式包括所有嵌套的复杂类型状态。类似地,如果执行 CancelEdit/EndEdit,则将以递归方式应用更改。ComplexObject 自身实现 IEditableObject,因此您可以获得针对并非由实体承载的复杂类型的完全编辑会话支持。

序列化

始终基于 DataContract/DataMember 批注对复杂类型成员深入地进行序列化。这刚好与由 IncludeAttribute 的应用程序控制其序列化的实体关联相反。

继承层次结构

System.Object
  System.ServiceModel.DomainServices.Client.ComplexObject

线程安全

此类型的任何公共静态(在 Visual Basic 中为 共享)成员都是线程安全的。不保证所有实例成员都是线程安全的。

平台

开发平台

Windows XP Home Edition, Windows XP Professional, Windows Server 2003 、Windows Server 2008 和 Windows 2000

目标平台

Change History

另请参见

参考

ComplexObject 成员
System.ServiceModel.DomainServices.Client 命名空间