方法: カスタム オブジェクト コンテキストを定義する (Entity Framework)
POCO エンティティを使用するときは、Entity Framework によるオブジェクト レイヤー生成を無効にします。 カスタム エンティティ型を定義するほかに、カスタム オブジェクト コンテキスト型を定義するか、手動で作成した EntityConnection のインスタンスを使用して、独自の接続を管理する必要もあります。このインスタンスは ObjectContext のコンストラクターに渡します。 EntityConnection の作成方法については、「EntityConnection の接続文字列を作成する方法 (Entity Framework)」を参照してください。
このトピックでは、カスタム オブジェクト コンテキストを作成する方法を示します。
注 : |
---|
オブジェクト レイヤーの生成を ADO.NET Entity Data Model Designer (エンティティ デザイナー) で無効にするには、エンティティ デザイナーで .edmx ファイルを開きます。デザイナー画面を右クリックして [プロパティ] をクリックします。[プロパティ] ウィンドウで、[コード生成方法] プロパティをクリックし、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);
}
}
参照
リファレンス
概念
オブジェクトのカスタマイズ (Entity Framework)