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.
Nota: |
---|
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
Agregue un archivo de código de clases al proyecto.
Incluya los siguientes espacios de nombres:
System
System.Data.Objects
System.Collections.Generic
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
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;
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; }
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
Conceptos
Personalizar objetos (Entity Framework)