방법: 사용자 지정 개체 컨텍스트 정의(Entity Framework)

POCO 엔터티를 사용할 경우 Entity Framework 에서 개체 계층이 생성되지 않도록 설정할 수 있습니다. 사용자 지정 엔터티 형식을 정의하는 것 외에도, 사용자 지정 개체 컨텍스트 형식을 정의하거나, 수동으로 만들어 ObjectContext의 생성자에 전달한 EntityConnection 인스턴스를 통해 사용자 고유의 연결을 관리해야 합니다. EntityConnection을 만드는 방법에 대한 자세한 내용은 방법: EntityConnection 연결 문자열 작성(Entity Framework)을 참조하십시오.

이 항목에서는 사용자 지정 개체 컨텍스트를 만드는 방법을 보여 줍니다.

Bb738471.note(ko-kr,VS.100).gif참고:
ADO.NET Entity Data Model Designer(Entity Designer)를 사용하여 개체 계층을 생성하지 않으려면 Entity Designer에서 .edmx 파일을 엽니다.디자이너 화면을 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.속성 창에서 Code Generation Strategy 속성을 선택하고 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>());
        }
    }
    

예제

이 예제에서는 Contact, OrderLineItem 사용자 지정 데이터 클래스를 지원하는 사용자 지정 개체 컨텍스트 코드를 보여 줍니다.

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