방법: 사용자 지정 개체 컨텍스트 정의(Entity Framework)
POCO 엔터티를 사용할 경우 Entity Framework 에서 개체 계층이 생성되지 않도록 설정할 수 있습니다. 사용자 지정 엔터티 형식을 정의하는 것 외에도, 사용자 지정 개체 컨텍스트 형식을 정의하거나, 수동으로 만들어 ObjectContext의 생성자에 전달한 EntityConnection 인스턴스를 통해 사용자 고유의 연결을 관리해야 합니다. EntityConnection을 만드는 방법에 대한 자세한 내용은 방법: EntityConnection 연결 문자열 작성(Entity Framework)을 참조하십시오.
이 항목에서는 사용자 지정 개체 컨텍스트를 만드는 방법을 보여 줍니다.
참고: |
---|
ADO.NET Entity Data Model Designer(Entity Designer)를 사용하여 개체 계층을 생성하지 않으려면 Entity Designer에서 .edmx 파일을 엽니다.디자이너 화면을 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.속성 창에서 Code Generation Strategy 속성을 선택하고 None을 선택합니다. |
사용자 지정 개체 컨텍스트 클래스는 방법: POCO 엔터티 정의(Entity Framework)에서 정의한 POCO 엔터티를 관리합니다.
사용자 지정 개체 컨텍스트에는 다음 기능이 포함되어야 합니다.
미리 정의된 연결을 포함하여 개념적 모델과 관련된 ObjectContext를 인스턴스화하는 기능
형식별 ObjectSet 개체를 반환하는 속성
사용자 지정 엔터티 형식을 정의하는 방법은 방법: POCO 엔터티 정의(Entity Framework)를 참조하십시오.
생성된 개체 컨텍스트 코드를 사용자 지정 개체 컨텍스트 코드에서 사용하려면
프로젝트에 클래스 코드 파일을 추가합니다.
다음 네임스페이스를 포함합니다.
System
System.Data.Objects
System.Collections.Generic
클래스 이름을 POCOAdventureWorksEntities로 바꿉니다. 클래스가 ObjectContext 클래스에서 상속하는지 확인합니다.
Partial Public Class POCOAdventureWorksEntities Inherits ObjectContext
public partial class POCOAdventureWorksEntities : ObjectContext
각 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;
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; }
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, Order 및 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);
}
}