Gewusst wie: Definieren eines benutzerdefinierten Objektkontexts (Entity Framework)
Wenn Sie POCO-Entitäten verwenden, deaktivieren Sie die Objektebenengenerierung von Entity Framework . Sie müssen nicht nur benutzerdefinierte Entitätstypen definieren, sondern entweder einen benutzerdefinierten Objektkontexttyp definieren oder eigene Verbindungen durch eine manuell erstellte Instanz von EntityConnection verwalten, die Sie an den Konstruktor von ObjectContext übergeben. Weitere Informationen zum Erstellen einer EntityConnection-Instanz finden Sie unter Gewusst wie: Erstellen einer EntityConnection-Verbindungszeichenfolge (Entity Framework).
Dieses Thema veranschaulicht, wie ein benutzerdefinierter Objektkontext erstellt wird.
Hinweis: |
---|
Um Objektebenengenerierung mit dem ADO.NET Entity Data Model Designer (Entity Designer) zu deaktivieren, öffnen Sie die EDMX-Datei im Entity Designer.Klicken Sie mit der rechten Maustaste auf die Designeroberfläche, und wählen Sie Eigenschaften aus.Wählen Sie im Fenster Eigenschaften die Eigenschaft Codegenerierungsstrategie aus, und wählen Sie None aus. |
Die benutzerdefinierte Objektkontextklasse verwaltet die POCO-Entitäten, die in Gewusst wie: Definieren von POCO-Entitäten (Entity Framework) definiert werden.
Ein benutzerdefinierter Objektkontext sollte die folgende Funktionalität beinhalten:
Das Instanziieren eines für das konzeptionelle Modell spezifischen ObjectContext-Kontexts, einschließlich vordefinierter Verbindungen.
Die Eigenschaften, die typenspezifische ObjectSet-Objekte zurückgeben.
Informationen zum Definieren von benutzerdefinierten Entitätstypen finden Sie unter Gewusst wie: Definieren von POCO-Entitäten (Entity Framework).
So verwenden Sie generierten Objektkontextcode im benutzerdefinierten Objektkontextcode
Fügen Sie dem Projekt eine Codedatei für eine Klasse hinzu.
Geben Sie die folgenden Namespaces an:
System
System.Data.Objects
System.Collections.Generic
Benennen Sie die Klasse in POCOAdventureWorksEntities um. Stellen Sie sicher, dass die Klasse von der ObjectContext-Klasse erbt.
Partial Public Class POCOAdventureWorksEntities Inherits ObjectContext
public partial class POCOAdventureWorksEntities : ObjectContext
Definieren Sie für jeden POCO-Entitätstyp Membervariablen des ObjectSet-Typs:
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;
Definieren Sie Konstruktoren für die POCOAdventureWorksEntities-Klasse.
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; }
Definieren Sie Eigenschaften, die
ObjectSet
-Objekte zurückgeben.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>()); } }
Beispiel
In diesem Beispiel wird der benutzerdefinierte Objektkontextcode veranschaulicht, der die benutzerdefinierten Datenklassen Contact, Order und LineItem unterstützt.
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);
}
}
Siehe auch
Verweis
Konzepte
Anpassen von Objekten (Entity Framework)