Cómo: Identificar que una entidad POCO es un proxy (Entity Framework)

Este tema muestra cómo identificar si una entidad POCO es un proxy. En determinadas ocasiones quizá desee probar si su objeto POCO es realmente un proxy. Al crear una entidad POCO utilizando el método CreateObject, si el tipo POCO no cumple los requisitos descritos en Requisitos para crear objetos proxy POCO (Entity Framework), se creará una entidad POCO en lugar de un objeto proxy. Para obtener más información, vea Trabajar con entidades POCO (Entity Framework).

El ejemplo de este tema utiliza las clases POCO que se definen en Cómo: Definir entidades POCO (Entity Framework) y un modelo de datos basado en AdventureWorks que se define en Cómo: Personalizar archivos de asignación y modelado para trabajar con objetos personalizados (Entity Framework).

Ejemplo

En el ejemplo siguiente se utiliza el método CreateObject para crear un objeto proxy. A continuación, el ejemplo comprueba si el objeto es un objeto proxy comparando el tipo POCO con el tipo proxy generado. Si los tipos no coinciden, entonces es un proxy. Si es un objeto proxy, se trata como mínimo de un objeto proxy de carga diferida. Para determinar si también es un objeto proxy del seguimiento de cambios, podemos ver si se realiza el seguimiento de los cambios.

Public Shared Function IsProxy(ByVal type As Object) As Boolean
    Return type IsNot Nothing AndAlso ObjectContext.GetObjectType(type.GetType()) <> type.GetType()
End Function

Public Shared Sub TestIfEntityIsProxy()
    Using context As New POCOAdventureWorksEntities()
        Dim newItem As LineItem = context.CreateObject(Of LineItem)()
        newItem.SalesOrderDetailID = 0
        ' Assign the order to the new LineItem. 
        newItem.SalesOrderID = 43680
        newItem.OrderQty = 1
        newItem.ProductID = 750
        newItem.UnitPriceDiscount = 0
        newItem.UnitPrice = 2171.2942D
        newItem.ModifiedDate = DateTime.Today
        newItem.rowguid = Guid.NewGuid()
        newItem.SpecialOfferID = 1

        context.LineItems.Attach(newItem)

        ' Determine if the instance is a proxy. 
        ' If it is a proxy it supports lazy loading. 
        Dim isLazyLoading As Boolean = IsProxy(newItem)

        ' Determine if it is a change tracking proxy by 
        ' making a change and verifying that it was detected. 
        newItem.OrderQty = 2
        Dim isChangeTracking As Boolean = _
            context.ObjectStateManager.GetObjectStateEntry(newItem).State = EntityState.Modified
    End Using
End Sub
public static bool IsProxy(object type)
{
    return type != null && ObjectContext.GetObjectType(type.GetType()) != type.GetType();
}

public static void TestIfEntityIsProxy()
{
    using (POCOAdventureWorksEntities context = new POCOAdventureWorksEntities())
    {
        LineItem newItem = context.CreateObject<LineItem>();
        newItem.SalesOrderDetailID = 0;
        // Assign the order to the new LineItem. 
        newItem.SalesOrderID = 43680;
        newItem.OrderQty = 1;
        newItem.ProductID = 750;
        newItem.UnitPriceDiscount = 0;
        newItem.UnitPrice = 2171.2942M;
        newItem.ModifiedDate = DateTime.Today;
        newItem.rowguid = Guid.NewGuid();
        newItem.SpecialOfferID = 1;

        context.LineItems.Attach(newItem);

        // Determine if the instance is a proxy.
        // If it is a proxy it supports lazy loading.
        bool isLazyLoading = IsProxy(newItem);

        // Determine if it is a change tracking proxy by
        // making a change and verifying that it was detected.
        newItem.OrderQty = 2;
        bool isChangeTracking = context.ObjectStateManager
                                  .GetObjectStateEntry(newItem)
                                  .State == EntityState.Modified;
    }
}

Vea también

Tareas

Cómo: Crear una entidad POCO con objetos proxy (Entity Framework)

Conceptos

Realizar el seguimiento de los cambios en entidades POCO (Entity Framework)