Как определить контекст пользовательского объекта (платформа Entity Framework)
При использовании сущностей POCO следует отключить создание слоев объектов при помощи Entity Framework . Помимо определения пользовательских типов сущностей, необходимо также определить пользовательский тип контекста объекта либо управлять собственными подключениями посредством созданного вручную экземпляра EntityConnection, который следует передать конструктору ObjectContext. Дополнительные сведения о создании подключения EntityConnection см. в разделе Как построить строку соединения EntityConnection (платформа Entity Framework).
В этом разделе показано, как создать контекст пользовательского объекта.
Примечание |
---|
Чтобы отключить создание уровней объектов при помощи ADO.NET Entity Data Model Designer (конструктор сущностей), откройте EDMX-файл в обозревателе решений.Щелкните правой кнопкой мыши в области конструктора и выберите пункт «Свойства».В окне Свойства выберите свойство Стратегия создания кода и укажите значение None. |
Класс контекста пользовательского объекта управляет сущностями POCO, определенными в Как определить сущности POCO (платформа Entity Framework).
Контекст пользовательского объекта должен включать следующие функции.
Возможность создания контекста 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
Определите переменные элементов типа ObjectSet для каждого типа сущности POCO:
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);
}
}
См. также
Справочник
Генератор модели EDM (EdmGen.exe)
Основные понятия
Настройка объектов (платформа Entity Framework)