Abflachen von Objekten (EntityDataSource)
In einigen Fällen erstellt das EntityDataSource-Steuerelement Wrapper um Entitäten. In diesem Thema werden Szenarien beschrieben, in denen der Wrapper erstellt wird, und es wird veranschaulicht, wie das Entitätsobjekt vom Wrapper abgerufen wird.
Wenn Sie das EntityDataSource-Steuerelement mit der EntitySetName-Eigenschaft initialisieren, wird von der EntityDataSource jede Entitätsinstanz in den Ergebnissen eines Objekts des ICustomTypeDescriptor-Typs umbrochen. Das Wrapperobjekt macht PropertyDescriptor s verfügbar, die die bidirektionale Datenbindung für Objekte eines komplexen Typs und für Objekte aktivieren, die an einer Beziehung teilnehmen. Der PropertyDescriptor bietet auch Zugriff auf Fremdschlüsselinformationen. Daher erhalten Sie, wenn Sie versuchen, das ursprüngliche Entitätsobjekt beispielsweise aus den Argumenten des RowDataBound-Ereignisses des GridView-Steuerelements abzurufen, ein Wrapperobjekt anstelle des Entitätsobjekts.
Hinweis
Die Entitätsobjekte werden nicht umbrochen, wenn Sie CommandText verwenden, um eine Abfrage anzugeben, die Entitätsobjekte oder eine Projektion bestimmter Eigenschaften zurückgibt, oder wenn Sie Select verwenden, um Projektionsabfragen zu erstellen.
Im folgenden Code wird gezeigt, wie ein Entitätsobjekt aus einem Wrapperobjekt abgerufen wird:
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);
}
}
}
Wenn Sie .NET Framework, Version 4 oder höher, verwenden, können Sie Fremdschlüsseleigenschaften in das Modell einschließen. In vielen Fällen benötigen Sie dabei keine Wrapperobjekte. Um die Wrappererstellung zu deaktivieren, legen Sie die EnableFlattening-Eigenschaft auf false fest. Standardmäßig ist EnableFlattening auf true festgelegt. Wenn das konzeptionelle Modell Fremdschlüsseleigenschaften einschließt und keine komplexen Typen enthält, legt der EntityDataSource-Designer EnableFlattening zur Entwurfszeit auf false fest, um das Erstellen von Entitätswrapperobjekten zu verhindern.