Freigeben über


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.

Bb738471.note(de-de,VS.100).gifHinweis:
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

  1. Fügen Sie dem Projekt eine Codedatei für eine Klasse hinzu.

  2. Geben Sie die folgenden Namespaces an:

    System

    System.Data.Objects

    System.Collections.Generic

  3. 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
    
  4. 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;
    
  5. 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;
     }
    
  6. 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

EDM-Generator (EdmGen.exe)

Konzepte

Anpassen von Objekten (Entity Framework)

Weitere Ressourcen

How to: Customize Object-Layer Code Generation