다음을 통해 공유


방법: POCO 엔터티가 프록시인지 식별(Entity Framework)

이 항목에서는 POCO 엔터티가 프록시인지 여부를 식별하는 방법을 보여 줍니다. POCO 개체가 실제로 프록시인지 여부를 테스트하려는 경우가 있습니다. CreateObject 메서드를 사용하여 POCO 엔터티를 만들 때 POCO 형식이 POCO 프록시를 만들기 위한 요구 사항(Entity Framework)에 설명된 요구 사항을 충족하지 않는 경우 POCO 엔터티가 프록시 개체 대신 만들어집니다. 자세한 내용은 POCO 엔터티 사용(Entity Framework)을 참조하십시오.

이 항목의 예제에서는 방법: POCO 엔터티 정의(Entity Framework)에 정의된 POCO 클래스와 방법: 사용자 지정 개체를 사용할 수 있도록 모델링 및 매핑 파일 사용자 지정(Entity Framework)에 정의된 AdventureWorks 기반 데이터 모델을 사용합니다.

예제

다음 예제에서는 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)