Cómo: Definir un contexto del objeto personalizado (Entity Framework)

Al utilizar entidades POCO, se deshabilita la generación de nivel de objeto que realiza Entity Framework . Además de definir tipos de entidad personalizados, deberá definir un tipo de contexto de objetos personalizado o administrar sus propias conexiones a través de una instancia de EntityConnection creada manualmente que debe pasar al constructor de ObjectContext. Para obtener más información sobre cómo crear una EntityConnection, vea Cómo generar una cadena de conexión EntityConnection (Entity Framework).

En este tema se muestra cómo crear un contexto de objetos personalizado.

Bb738471.note(es-es,VS.100).gifNota:
Para deshabilitar la generación de nivel de objeto con ADO.NET Entity Data Model Designer (Entity Designer), abra el archivo .edmx en Entity Designer.Haga clic con el botón secundario en la superficie del diseñador y seleccione Propiedades.En la ventana Propiedades, seleccione la propiedad Estrategia de generación de código y haga clic en None.

La clase del contexto de objetos personalizada administra las entidades POCO que se definen en Cómo: Definir entidades POCO (Entity Framework).

Un contexto de objetos personalizado debería incluir la siguiente funcionalidad:

  • La capacidad de crear instancias de un ObjectContext específico del modelo conceptual utilizado, incluidas las conexiones predefinidas.

  • Propiedades que devuelven objetos ObjectSet de un tipo específico.

Para obtener información sobre cómo definir tipos de entidad personalizados, vea Cómo: Definir entidades POCO (Entity Framework).

Para utilizar el código del contexto de objetos generado en su código del contexto de objetos personalizado

  1. Agregue un archivo de código de clases al proyecto.

  2. Incluya los siguientes espacios de nombres:

    System

    System.Data.Objects

    System.Collections.Generic

  3. Cambie el nombre de la clase a POCOAdventureWorksEntities. Asegúrese de que la clase hereda de la clase ObjectContext.

    Partial Public Class POCOAdventureWorksEntities
        Inherits ObjectContext
    
    public partial class POCOAdventureWorksEntities : ObjectContext
    
  4. Defina variables miembro del tipo ObjectSet para cada tipo de entidad 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. Defina constructores para la clase 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. Defina propiedades que devuelvan objetos 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>());
        }
    }
    

Ejemplo

En este ejemplo se muestra el código del contexto de objetos personalizado que permite usar las clases de datos personalizadas Contact, Order y 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);
    }

}

Vea también

Referencia

Generador de EDM (EdmGen.exe)

Conceptos

Personalizar objetos (Entity Framework)

Otros recursos

How to: Customize Object-Layer Code Generation