创建 POCO 代理的要求(实体框架)

实体框架 支持 POCO 类(“纯旧式”CLR 对象)。 若要启用 POCO 实体的延迟加载并且在发生更改时希望实体框架 跟踪类中的更改,则 POCO 类必须满足本主题中所述的要求,以便实体框架 可以在运行时期间为 POCO 实体创建代理。 代理类派生自 POCO 类型。

类定义要求

实体框架 在类满足下面所述要求时为 POCO 实体创建代理。 POCO 实体可拥有支持更改跟踪或延迟加载的代理对象。 无需满足更改跟踪代理的要求即可拥有延迟加载代理,但是如满足更改跟踪代理要求也会创建延迟加载代理。 可以通过将 LazyLoadingEnabled 选项设置为 false 来禁用延迟加载。

对于要创建的任何代理:

  • 必须使用公共访问声明自定义数据类。

  • 自定义数据类不得为 sealed(在 Visual Basic 中为 NotInheritable

  • 自定义数据类不得为 abstract(在 Visual Basic 中为 MustInherit)。

  • 自定义数据类必须具有一个不带参数的 publicprotected 构造函数。 如果希望使用 CreateObject 方法为 POCO 实体创建代理,请使用不带参数的 protected 构造函数。 调用 CreateObject 方法不保证会创建该代理:POCO 类必须满足本主题中所述的其他要求。

  • 该类无法实现 IEntityWithChangeTrackerIEntityWithRelationships 接口,因为代理类实现这些接口。

  • 必须将 ProxyCreationEnabled 选项设置为 true

对于延迟加载代理:

  • 必须将每个导航属性声明为 publicvirtual(在 Visual Basic 中为 Overridable),而不是 sealed(在 Visual Basic 中为 NotOverridable)get 访问器。 自定义数据类中定义的导航属性必须在概念模型中具有一个相应的导航属性。 有关更多信息,请参见加载相关 POCO 实体(实体框架)

对于更改跟踪代理:

  • 映射到数据模型中实体类型属性的每个属性必须具有非密封(在 Visual Basic 中为 NotOverridable)、publicvirtual(在 Visual Basic 中为 Overridable)get 和 set 访问器。

  • 表示关系“多”端的导航属性必须返回实现 ICollection 的类型,其中 T 是该关系另一端处对象的类型。

  • 如果希望代理类型随对象一起创建,请在创建新对象时使用 ObjectContextCreateObject 方法,而不是使用 new 运算符。

如果在运行时需要知道 POCO 实体是否是代理,请按照如何:确定某个 POCO 实体是代理(实体框架)中所述的步骤执行操作。

另请参见

任务

演练:使用 WCF 序列化 POCO 代理(实体框架)

概念

使用 POCO 实体(实体框架)
跟踪 POCO 实体中的更改(实体框架)