方法: カスタム オブジェクト コンテキストを定義する (Entity Framework)

POCO エンティティを使用するときは、Entity Framework によるオブジェクト レイヤー生成を無効にします。 カスタム エンティティ型を定義するほかに、カスタム オブジェクト コンテキスト型を定義するか、手動で作成した EntityConnection のインスタンスを使用して、独自の接続を管理する必要もあります。このインスタンスは ObjectContext のコンストラクターに渡します。 EntityConnection の作成方法については、「EntityConnection の接続文字列を作成する方法 (Entity Framework)」を参照してください。

このトピックでは、カスタム オブジェクト コンテキストを作成する方法を示します。

Bb738471.note(ja-jp,VS.100).gif注 :
オブジェクト レイヤーの生成を ADO.NET Entity Data Model Designer (エンティティ デザイナー) で無効にするには、エンティティ デザイナーで .edmx ファイルを開きます。デザイナー画面を右クリックして [プロパティ] をクリックします。[プロパティ] ウィンドウで、[コード生成方法] プロパティをクリックし、None をクリックします。

カスタム オブジェクト コンテキスト クラスは、方法: POCO エンティティを定義する (Entity Framework) に定義されている POCO エンティティを管理します。

カスタム オブジェクト コンテキストには次の機能を含めるようにします。

  • 定義済みの接続など、概念モデルに固有の ObjectContext をインスタンス化する機能。

  • 型固有の ObjectSet オブジェクトを返すプロパティ。

カスタム エンティティ型の定義については、「方法: POCO エンティティを定義する (Entity Framework)」を参照してください。

生成されたオブジェクト コンテキスト コードをカスタム オブジェクト コンテキスト コードで使用するには

  1. クラス コード ファイルをプロジェクトに追加します。

  2. 次の名前空間を含めます。

    System

    System.Data.Objects

    System.Collections.Generic

  3. クラスの名前を POCOAdventureWorksEntities に変更します。 クラスが ObjectContext クラスから継承されることを確認します。

    Partial Public Class POCOAdventureWorksEntities
        Inherits ObjectContext
    
    public partial class POCOAdventureWorksEntities : ObjectContext
    
  4. POCO エンティティ型ごとに、ObjectSet 型のメンバー変数を定義します。

    Private _contacts As ObjectSet(Of Contact)
    Private _lineItems As ObjectSet(Of LineItem)
    Private _orders As ObjectSet(Of Order)
    
    private ObjectSet<Contact> _contacts;
    private ObjectSet<LineItem> _lineItems;
    private ObjectSet<Order> _orders;
    
  5. POCOAdventureWorksEntities クラスのコンストラクターを定義します。

    Public Sub New()
        MyBase.New("name=AdventureWorksEntities", "AdventureWorksEntities")
        Me.ContextOptions.LazyLoadingEnabled = True
    End Sub
    
    Public Sub New(ByVal connectionString As String)
        MyBase.New(connectionString, "AdventureWorksEntities")
        Me.ContextOptions.LazyLoadingEnabled = True
    End Sub
    
     public POCOAdventureWorksEntities()
         : base("name=AdventureWorksEntities", "AdventureWorksEntities")
     {
         this.ContextOptions.LazyLoadingEnabled = true;
    }
    
     public POCOAdventureWorksEntities(string connectionString)
         : base(connectionString, "AdventureWorksEntities")
     {
         this.ContextOptions.LazyLoadingEnabled = true;
     }
    
  6. ObjectSet オブジェクトを返すプロパティを定義します。

    Public ReadOnly Property Contacts() As ObjectSet(Of Contact)
        Get
            Return If(_contacts, MyBase.CreateObjectSet(Of Contact)())
        End Get
    End Property
    
    Public ReadOnly Property LineItems() As ObjectSet(Of LineItem)
        Get
            Return If(_lineItems, MyBase.CreateObjectSet(Of LineItem)())
        End Get
    End Property
    
    Public ReadOnly Property Orders() As ObjectSet(Of Order)
        Get
            Return If(_orders, MyBase.CreateObjectSet(Of Order)())
        End Get
    End Property
    
    public ObjectSet<Contact> Contacts
    {
        get
        {
            return _contacts ?? (_contacts = base.CreateObjectSet<Contact>());
        }
    }
    
    public ObjectSet<LineItem> LineItems
    {
        get
        {
            return _lineItems ?? (_lineItems = base.CreateObjectSet<LineItem>());
        }
    }
    
    public ObjectSet<Order> Orders
    {
        get
        {
            return _orders ?? (_orders = base.CreateObjectSet<Order>());
        }
    }
    

次の例は、ContactOrder、および LineItem のカスタム データ クラスをサポートするカスタム オブジェクト コンテキスト コードを示しています。

Partial Public Class POCOAdventureWorksEntities
    Inherits ObjectContext
    Private _contacts As ObjectSet(Of Contact)
    Private _lineItems As ObjectSet(Of LineItem)
    Private _orders As ObjectSet(Of Order)
#Region "Constructors"
    Public Sub New()
        MyBase.New("name=AdventureWorksEntities", "AdventureWorksEntities")
        Me.ContextOptions.LazyLoadingEnabled = True
    End Sub

    Public Sub New(ByVal connectionString As String)
        MyBase.New(connectionString, "AdventureWorksEntities")
        Me.ContextOptions.LazyLoadingEnabled = True
    End Sub
#End Region

#Region "ObjectSet Properties"
    Public ReadOnly Property Contacts() As ObjectSet(Of Contact)
        Get
            Return If(_contacts, MyBase.CreateObjectSet(Of Contact)())
        End Get
    End Property

    Public ReadOnly Property LineItems() As ObjectSet(Of LineItem)
        Get
            Return If(_lineItems, MyBase.CreateObjectSet(Of LineItem)())
        End Get
    End Property

    Public ReadOnly Property Orders() As ObjectSet(Of Order)
        Get
            Return If(_orders, MyBase.CreateObjectSet(Of Order)())
        End Get
    End Property

#End Region
    Public Overloads Overrides Function SaveChanges(ByVal options As SaveOptions) As Integer

        For Each entry As ObjectStateEntry In ObjectStateManager.GetObjectStateEntries(EntityState.Added Or EntityState.Modified)
            ' Validate the objects in the Added and Modified state 
            ' if the validation fails throw an exeption. 
        Next
        Return MyBase.SaveChanges(options)
    End Function

End Class
public partial class POCOAdventureWorksEntities : ObjectContext
{
    private ObjectSet<Contact> _contacts;
    private ObjectSet<LineItem> _lineItems;
    private ObjectSet<Order> _orders;
    #region Constructors
    public POCOAdventureWorksEntities()
        : base("name=AdventureWorksEntities", "AdventureWorksEntities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
   }

    public POCOAdventureWorksEntities(string connectionString)
        : base(connectionString, "AdventureWorksEntities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
    }
    #endregion

    #region ObjectSet Properties
    public ObjectSet<Contact> Contacts
    {
        get
        {
            return _contacts ?? (_contacts = base.CreateObjectSet<Contact>());
        }
    }

    public ObjectSet<LineItem> LineItems
    {
        get
        {
            return _lineItems ?? (_lineItems = base.CreateObjectSet<LineItem>());
        }
    }

    public ObjectSet<Order> Orders
    {
        get
        {
            return _orders ?? (_orders = base.CreateObjectSet<Order>());
        }
    }

    #endregion
    public override int SaveChanges(SaveOptions options)
    {

        foreach (ObjectStateEntry entry in
            ObjectStateManager.GetObjectStateEntries(
            EntityState.Added | EntityState.Modified))
        {
            // Validate the objects in the Added and Modified state
            // if the validation fails throw an exeption.
        }
        return base.SaveChanges(options);
    }

}

参照

リファレンス

EDM ジェネレーター (EdmGen.exe)

概念

オブジェクトのカスタマイズ (Entity Framework)

その他のリソース

How to: Customize Object-Layer Code Generation