Как определить контекст пользовательского объекта (платформа Entity Framework)

При использовании сущностей POCO следует отключить создание слоев объектов при помощи Entity Framework . Помимо определения пользовательских типов сущностей, необходимо также определить пользовательский тип контекста объекта либо управлять собственными подключениями посредством созданного вручную экземпляра EntityConnection, который следует передать конструктору ObjectContext. Дополнительные сведения о создании подключения EntityConnection см. в разделе Как построить строку соединения EntityConnection (платформа Entity Framework).

В этом разделе показано, как создать контекст пользовательского объекта.

Bb738471.note(ru-ru,VS.100).gifПримечание
Чтобы отключить создание уровней объектов при помощи ADO.NET Entity Data Model Designer (конструктор сущностей), откройте EDMX-файл в обозревателе решений.Щелкните правой кнопкой мыши в области конструктора и выберите пункт «Свойства».В окне Свойства выберите свойство Стратегия создания кода и укажите значение None.

Класс контекста пользовательского объекта управляет сущностями POCO, определенными в Как определить сущности POCO (платформа Entity Framework).

Контекст пользовательского объекта должен включать следующие функции.

  • Возможность создания контекста 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. Определите переменные элементов типа 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;
    
  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, 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)

Другие ресурсы

How to: Customize Object-Layer Code Generation