Share via


Procédure : déterminer si une entité POCO est un proxy (Entity Framework)

Cette rubrique explique comment déterminer si une entité POCO est un proxy. Dans certains cas, vous pouvez souhaiter tester votre objet POCO pour déterminer s'il est effectivement un proxy. Lorsque vous créez une entité POCO à l'aide de la méthode CreateObject, si le type POCO ne satisfait pas les exigences décrites dans la rubrique Spécifications pour la création de proxys POCO (Entity Framework), une entité POCO sera créée au lieu d'un objet proxy. Pour plus d'informations, consultez Utilisation d'entités POCO (Entity Framework).

L'exemple de cette rubrique utilise les classes POCO définies dans Procédure : définir des entités POCO (Entity Framework) et un modèle de données basé sur AdventureWorks défini dans Procédure : personnaliser des fichiers de modèle et de mappage pour utiliser des objets personnalisés (Entity Framework).

Exemple

L'exemple suivant utilise la méthode CreateObject pour créer un objet proxy. On vérifie ensuite si l'objet est un objet proxy en comparant le type POCO au type de proxy généré. Si les types ne sont pas les mêmes, c'est un proxy. Si c'est un objet proxy, c'est au minimum un objet proxy à chargement différé. Pour déterminer si c'est également un objet proxy de suivi des modifications, nous pouvons voir si les modifications sont suivies.

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

Voir aussi

Tâches

Procédure : créer une entité POCO avec les proxys (Entity Framework)

Concepts

Suivi des modifications dans les entités POCO (Entity Framework)