次の方法で共有


方法: POCO エンティティがプロキシであることを識別する (Entity Framework)

このトピックでは、POCO エンティティがプロキシかどうかを識別する方法を説明します。 POCO オブジェクトが実際にプロキシであるかどうかをテストしたい状況が生じる場合があります。 CreateObject メソッドを使用して POCO エンティティを作成した場合、POCO 型が「POCO プロキシの作成要件 (Entity Framework)」で説明した必要条件を満たしていなければ、プロキシ オブジェクトではなく POCO エンティティが作成されます。 For more information, see 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)