Procedura: stabilire se un'entità POCO è un proxy (Entity Framework)

In questo argomento viene illustrato come stabilire se un'entità POCO è un proxy. Esistono situazioni in cui si desidera testare se l'oggetto POCO è un proxy. Quando si crea un'entità POCO tramite il metodo CreateObject, se il tipo POCO non soddisfa i requisiti descritti in Requisiti per la creazione di proxy POCO (Entity Framework), verrà creata un'entità POCO anziché un oggetto proxy. Per ulteriori informazioni, vedere Utilizzo di entità POCO (Entity Framework).

Nell'esempio di questo argomento vengono utilizzati le classi POCO definite in Procedura: definire entità POCO (Entity Framework) e un modello di dati basato su AdventureWorks definito in Procedura: personalizzare i file di mapping e di modellazione per l'utilizzo con oggetti personalizzati (Entity Framework).

Esempio

Nell'esempio seguente viene utilizzato il metodo CreateObject per creare un oggetto proxy. Si verifica quindi se l'oggetto è un oggetto proxy confrontando il tipo POCO con il tipo di proxy generato. Se i tipi sono diversi, l'oggetto è un proxy. Se è un oggetto proxy, come minimo si tratta di un oggetto proxy con caricamento lazy. Per determinare se si tratta anche di un oggetto proxy con il rilevamento delle modifiche, è possibile controllare se le modifiche vengono registrate.

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;
    }
}

Vedere anche

Attività

Procedura: creare un'entità POCO con proxy (Entity Framework)

Concetti

Rilevamento delle modifiche nelle entità POCO (Entity Framework)