Freigeben über


Gewusst wie: Erkennen, dass eine POCO-Entität ein Proxy ist (Entity Framework)

Dieses Thema zeigt, wie ermittelt wird, ob eine POCO-Entität ein Proxy ist. Es gibt Situationen, in denen Sie überprüfen möchten, ob ein POCO-Objekt eigentlich ein Proxy ist. Wenn Sie mit der CreateObject-Methode eine POCO-Entität erstellen, und der POCO-Typ die in Anforderungen für die Erstellung von POCO-Proxys (Entity Framework) beschriebenen Anforderungen nicht erfüllt, wird eine POCO-Entität statt eines Proxyobjekts erstellt. Weitere Informationen finden Sie unter Arbeiten mit POCO-Entitäten (Entity Framework).

Das Beispiel in diesem Thema verwendet POCO-Klassen, die in Gewusst wie: Definieren von POCO-Entitäten (Entity Framework) definiert sind, sowie ein auf AdventureWorks basierendes Datenmodell, das in Gewusst wie: Anpassen von Modellierungs- und Zuordnungsdateien zur Verwendung mit benutzerdefinierten Objekten (Entity Framework) definiert ist.

Beispiel

Im folgenden Beispiel wird die CreateObject-Methode verwendet, um ein Proxyobjekt zu erstellen. Im Beispiel wird dann der POCO-Typ mit dem generierten Proxytyp verglichen, um zu überprüfen, ob das Objekt ein Proxyobjekt ist. Sind die beiden Typen nicht gleich, ist das Objekt ein Proxy. Wenn es ein Proxyobjekt ist, dann ist es zumindest ein Lazy Loading-Proxyobjekt. Ob es auch ein Änderungsnachverfolgungsproxyobjekt ist, können wir erkennen, wenn Änderungen nachverfolgt werden.

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

Siehe auch

Aufgaben

Gewusst wie: Erstellen einer POCO-Entität mit Proxys (Entity Framework)

Konzepte

Verfolgen von Änderungen in POCO-Entitäten (Entity Framework)