在某些情况下,EntityDataSource 控件会围绕实体创建包装。 本主题描述创建包装的情形,并演示如何从包装中获取实体对象。
当您使用 EntitySetName 属性初始化 EntityDataSource 控件时,EntityDataSource 会将每个实体实例包装在 ICustomTypeDescriptor 类型的某个对象的结果中。 包装对象会公开 PropertyDescriptors,以针对复杂类型的对象以及参与某个关系的对象启用双向数据绑定。 PropertyDescriptor 还提供对外键信息的访问权限。 因此,如果尝试获取原始实体对象(例如从 GridView 控件的 RowDataBound 事件的参数中获取),则将会获取包装对象,而不是实体对象。
备注
如果使用 CommandText 指定用于返回实体对象或特定属性投影的查询,或使用 Select 来生成投影查询,则不会包装实体对象。
以下代码演示如何从包装对象中获取实体对象:
protected void ProductsGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    var entity = dataItem as Product;
    if (entity == null)
    {
        var td = dataItem as ICustomTypeDescriptor;
        if (td != null)
        {
            entity = (Product)td.GetPropertyOwner(null);
        }
    }
}
如果使用的是 .NET Framework 4 版或更高版本,则可以在模型中包括外键属性。 这样在许多情况下就无需包装对象了。 若要关闭包装创建,请将 EnableFlattening 属性设置为 false。 默认情况下,EnableFlattening 为 true。 如果概念模型包括外键属性而不包含复杂类型,则 EntityDataSource 设计器会在设计时将 EnableFlattening 设置为 false,以避免创建实体包装对象。