Как определить, является ли сущность POCO прокси-сущностью (платформа Entity Framework)

Данный раздел демонстрирует, как определить, является ли сущность POCO прокси-сущностью. В некоторых случаях необходимо проверить, не является ли объект POCO на самом деле прокси-сущностью. При создании сущности POCO посредством метода CreateObject, если тип POCO не соответствует требованиям, описанным в Требования к созданию прокси-сущностей POCO (платформа Entity Framework), то вместо прокси-объекта создается сущность POCO. Дополнительные сведения см. в разделе Работа с сущностями POCO (платформа Entity Framework).

В примере из этого раздела используются классы POCO, определенные в разделе Как определить сущности POCO (платформа Entity Framework), и модель данных на основе AdventureWorks, определенная в разделе Как настроить файлы моделирования и сопоставления для работы с пользовательскими объектами (платформа Entity Framework).

Пример

В следующем примере для создания прокси-объекта используется метод CreateObject. Затем пример проверяет, является ли объект прокси-объектом, сравнивая тип POCO с созданным прокси-типом. Если типы не совпадают, то объект является прокси-объектом. Если объект является прокси-объектом, то он как минимум представляет собой прокси-объект «неспешной» загрузки. Чтобы определить, является ли он также прокси-объектом, отслеживающим изменения, можно проверить, отслеживаются ли изменения.

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

См. также

Задачи

Как создать сущность POCO с прокси (платформа Entity Framework)

Основные понятия

Отслеживание изменений в сущностях POCO (платформа Entity Framework)