Dieser Artikel wurde maschinell übersetzt.

Datenpunkte

Häufig gestellte Fragen zu Code First und DbContext in Entity Framework

Julie Lerman

 

Julie LermanIn diesem Monat möchte ich die Antworten auf Fragen, die ich zu ersten Code und DbContext in Entity Framework 4.2 gestellte bin teilen. Um Platz zu maximieren, werde ich zu weiteren Ressourcen zeigen, Sie detaillierte Informationen finden, das Material zu ergänzen, die, das ich bereitstellen.

Wird erster Code und DbContext hinzugefügt werden die.NET Framework?

Nr. Landesvorwahl zuerst und DbContext wird separat von der Microsoft verteilt werden.NET Framework release Zyklus, sodass das Entity Framework-Team um Updates zu veröffentlichen, wenn sie bereit sind, ohne warten auf die nächste offizielle Version von der.NET Framework. Landesvorwahl zuerst und der DbContext-API sind Teil der EntityFramework.dll-Assembly, die Sie Ihren Projekten, die dynamisch mit NuGet hinzufügen können. NuGet-Erweiterung in Visual Studio installieren können Sie die Bibliothek-Paket-Manager, die Sie Ihrem Projekt einen Verweis auf EntityFramework.dll hinzufügen können. Abbildung 1 zeigt das EntityFramework Paket (derzeit der beliebteste Download in der NuGet Paket Bibliothek) in den Visual Studio Library Package Manager.

Installing Code First and DbContext into a Project via EntityFramework.dll
Abbildung 1 Code zuerst installieren und DbContext in ein Projekt über EntityFramework.dll

Lesen Sie mehr über das Team der Pläne für die Features von Entity Framework und warum sie beschlossen, mit Fokus auf NuGet für die Bereitstellung von bestimmten Arten von Funktionen außerhalb der Freigabe der.NET-APIs in ihre Oktober 2011 Blog-Post, "Wie wir sprechen über EF und seine Zukunft Versionen" (bit.ly/owoWgn).

Filtern Sie verwandte Daten mit einschließen?

Nr. Die Include-Methode können Sie eifrig Daten laden, beim Ausführen von Abfragen für ein Entitätsdatenmodell. Leider können Sie nur die Sätze von verwandten Daten mit unverzüglichem Laden abrufen. Dies gilt auch für verzögertes Laden und alle aber ein Fall für das explizite Laden. Diesem Fall: Wenn Sie explizit durch die Änderungsnachverfolgung API zu laden, können Sie eine Query-Methode, gefolgt von einer Where filtern:

context.Entry(personInstance)
  .Collection(p => p.Aliases)
  .Query()
  .Where(a=>a.FirstName == "Natasha")
  .Load();

Aber klar zu sein, Sie können dies für begierig mit Include laden nicht.

Dies ist wie Include gearbeitet hat, seit der ersten Version von Entity Framework in der.NET Framework 3.5. Wenn Sie vorzeitiges Laden mit Filtern kombinieren möchten, sollten Sie Projektionen. Lesen Sie mehr dazu in der Spalte Juni 2011 Datenpunkte "Demystifying Entity Framework Strategien: Laden von verwandte Daten,"am msdn.microsoft.com/magazine/hh205756. Ich habe auch einen Blog-Post zum Thema "Verwendung Projektionen und ein Repository zu Fake ein gefiltert eifrig Load," geschrieben, bei bit.ly/uZdnxy.

Wie kann ich verwenden Lambda-Ausdrücke mit einbeziehen?

Mit der ObjectContext ist der einzige Weg zu Include verwenden durch Übergeben einer Zeichenfolge zur Darstellung der Navigationseigenschaft Spannung geladen werden. Haben Sie eine Klasse von Straße mit Bäumen, eine Eigenschaft, die eine ICollection <Tree> ist, würden Sie z. B. für Straßen mit ihren Bäumen wie folgt Abfragen:

context.Roads.Include("Trees")

Viele Entwickler haben ihre eigenen Erweiterungsmethoden um einen stark typisierten Ausdruck verwenden können:

context.Roads.Include(r => r.Trees)

Die Möglichkeit zum Verwenden von Lambda-Ausdrücken mit einbeziehen ist jetzt in der DbContext-API integriert. Ein Beispiel finden Sie in Teil 6 von Arthur Vickers wunderbaren 12 teilige Blog-Serie über den DbContext API (bit.ly/wgI5zW). Ihre Versuche, dieses Feature zu verwenden hätte nicht erfolgreich, jedoch — wie mir waren. Ich musste mein Ego beiseite und bitten jemanden im Team wie den Lambda-Support zu erhalten. Es stellt sich heraus, neben einen Verweis auf EntityFramework.dll, müssen Sie eine using Direktive (oder Imports für Visual Basic) für System.Data.Entity in der Codedatei, wo Sie versucht sind, einschließen ein Lambda-Ausdruck verwenden. Wenn Sie das Laden auf eine Auflistung, die mehrere Ebenen von Beziehungen mithilfe der Lambda-Ausdrücke begierig erweitern möchten, müssen Sie zusätzliche Select Methoden zu integrieren. Zum Beispiel, wenn die Tree-Klasse eine ICollection <Leaf> hat und Sie wollen zu eifrig laden die Blätter zusammen mit den Bäumen, die String-Darstellung würde wie folgt aussehen:

context.Roads.Include("Trees.Leaves")

Lambda-Ausdrucks hängt jedoch zusätzliche Logik auf die nächste Ebene der Beziehung zu bieten. Hier ist die Syntax, die Sie verwenden würden, um Straßen zusammen mit den Bäumen und ihre Blätter auszuwählen:

context.Roads.Include(r => r.Trees.Select(t => t.Leaves))

Ich kann nicht sprechen über die Verwendung von mehreren Ebenen sind ohne eine Erinnerung, die die weitere Beziehungen, die Sie gerne versuchen mit einschließen, die komplexere und degradierten geladen, die die SQL-Abfrage werden könnte. Ich empfehle immer Profilerstellung die SQL generiert von Entity Framework (EF). In der Tat, veranschaulicht die Dezember 2010 Datenpunkte-Spalte verschiedene Möglichkeiten die Datenbank ein Profil bei EF.

Ich war überrascht zu erfahren, wenn Sie den ObjectContext-API verwenden, ein Verweis auf EntityFramework.dll sowie eine using-Direktive System.Data.Entity Sie Lambda-Ausdrücke mit einbeziehen, auch hierbei nutzen lassen wird.

Muss ich warten, bis die.NET Framework 4.5 Wenn ich Code zuerst mit WCF Data Services verwenden möchten?

Es gibt zwei Assemblys zum Erstellen und Verwenden von WCF Data Services in der.NET Framework 4 Beta 2: System.Data.Services.dll und System.Data.Services.Client.dll. Wenn Sie versuchen, diese mit einem DbContext und Code ersten Klassen verwenden, funktioniert sie nicht out of the Box. Das Problem ist mit DbContext, nicht Code erste. DbContext vorhanden nicht, wenn diese Assemblys erstellt wurden, so dass sie es nicht verstehen. Im März 2011 veröffentlicht Microsoft eine Community Technology Preview (CTP), die feste bis Assemblys (Microsoft.Data.Services.dll und Microsoft.Data.Services.Client.dll), die Wissen enthalten, wie man mit den DbContext arbeiten. Also alles, was Sie tun müssen ist die Standardassemblys mit diese neue Assemblys und in Ihren Datendiensten ersetzen DataServiceProtocolVersion als anstatt V2 V3 angeben. Hier ist ein Beispiel für ein einfache Datendienst aussehen könnte wie Verfügbarmachen von einen Kontext (PersonModelContext), der von DbContext erbt:

public class DataService : DataService<PersonModelContext>
  {
    public static void InitializeService(DataServiceConfiguration config)
    {
      config.SetEntitySetAccessRule("People", EntitySetRights.All);
      config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
    }
}

Das Problem mit dieser Lösung ist, dass die neuen Assemblys nur CTPs sind und nicht für Produktionszwecke. Sie müssen warten, bis die nächste Released Manufacturing (RTM) Version von Data Services, damit sie in der Produktion verwendet werden.

Aber es ist möglich, eine DbContext mit verwenden.NET Framework 4 System.Data.Services Assemblys. Die CTP-Assemblys vorhanden sind, nur zur Vermeidung zusätzlichen Code schreiben. Alles, was Sie tun müssen, ist der Zugang der zugrunde liegenden ObjectContext, die den DbContext unterstützt und bereitstellen, die an den Dienst. Im Juli 2010, Rowan Miller, ein wichtiger Akteur bei Microsoft hinter ersten Code, hat dies in einem Blog-Post, "EF CTP4 Tipps & Tricks: WCF Data Service auf DbContext"(bit.ly/c2EA0l). Dieser Blog wurde für eine frühe Vorschau auf den DbContext geschrieben, so dass ich aktualisiert seine Beispiel funktioniert mit der Version der DbContext Klasse in Entity Framework 4.2 mit PersonModelContext, ein einfaches Modell, das ein DbSet für eine Person-Klasse verfügbar macht. Der Kontext und Klasse sind in Abbildung 2 dargestellt.

Abbildung 2 Einfaches DbContext und Klasse, die von einem Datendienst verwendet

public class PersonModelContext : DbContext
{
  public DbSet<Person> People { get; set; }
}
public class Person
{
  public int PersonId { get; set; }
  [MaxLength(10)]
  public string IdentityCardNumber { get; set; }
  public string FirstName { get; set; }
  [Required]
  public string LastName { get; set; }
}

Der Datendienst ist dann definiert speziell für die PersonModelContext, die DbContext abgeleitet, anstatt mit einem ObjectContext zu arbeiten. Dann, durch Überschreiben der Daten service CreateData­Source-Methode, können Sie den ObjectContext, die zugrunde die PersonModelContext liegt, wodurch den benötigten ObjectContext auf, um den Service, wie in Abbildung 3 dargestellt verfügbar machen.

Abbildung 3 A WCF Data Service, der eine DbContext mit verwendet.NET Framework 4 Service-APIs

public class DataService : DataService<ObjectContext>
{
  public static void InitializeService(DataServiceConfiguration config)
  {
    config.SetEntitySetAccessRule("People", EntitySetRights.All);
    config.DataServiceBehavior.MaxProtocolVersion =
      DataServiceProtocolVersion.V2;
  }
  protected override ObjectContext CreateDataSource()
  {
    var dbContext = new PersonModelContext();
    var oContext = ((IObjectContextAdapter)dbContext).ObjectContext;
    return oContext;
  }
}

Da ich möchte auf die Bereitstellung von ObjectContext zu konzentrieren, ist dies eine vereinfachte Ansicht des Codes haben Sie vielleicht in WCF Data Services.

Der Nachteil dieses Ansatzes besteht darin, dass Sie nicht DbContext Funktionen wie die Validierung verwenden können (wie in meinem Artikel vom Dezember 2011 Datenpunkte "Umgang mit Entity Framework Validierungen in WCF Data Services," am msdn.microsoft.com/magazine/hh580732) Da der Service mit einem ObjectContext arbeiten soll.

Sollte ich Anmerkungen für Daten oder die Fluent API Code erste Konfigurationen verwenden?

Ich gefragt, diese Frage viel. Um die Antwort zu verstehen, ist es hilfreich, zunächst die allgemeinen Unterschiede zwischen diesen beiden Optionen zu verstehen.

Code zuerst erweitert die Anmerkungen für Daten, die sind bereits Teil der.NET Framework 4 System.ComponentModel.DataAnnotations-Namespace. Neben Anmerkungen wie z. B. ValidationAttributes (erforderlich, StringLength, RegEx), Entity Framework fügt Attribute zu Datenbank-Zuordnungen (z.B. Spalte, Tabelle und Timestamp) oder andere Modell-spezifische Features wie z. B. ComplexType angeben. Anmerkungen sind einfach in einer Klasse anwenden, wie die Person-Klasse in Abbildung 2 veranschaulicht.

Es gibt einige mögliche Nachteile mit Anmerkungen für Daten konfigurieren Sie Ihre Klassen für Code erste. Ist, dass Sie möglicherweise kein Fan von Ihr Geschäftsklassen Persistenz-bezogene Logik hinzufügen. Wenn Sie sich gefragt haben, "Was bedeutet der Name einer Spalte der Datenbank haben, mit meinem Domänenmodell zu tun?" könnten Sie nicht die Anmerkungen für Daten verwenden möchten. Ein weiterer ist, dass diese Zuordnungen Sie Verweis EntityFramework.dll aus Assemblys erforderlich, die Ihr Geschäftsklassen enthalten. (Dies ändert sich nach der.NET Framework 4.5, die Besitzrechte der EF-bezogene Datenanmerkungen wird.) Die auch etwas möglicherweise nicht, was Sie wollen, vor allem, wenn Sie Ihre Anwendung über Tiers hinweg verteilen sind. Darüber hinaus setzen die ersten Daten Codeanmerkungen nicht das komplette Lineup von Konfigurationen, die mit Code erste angewendet werden können. Einige Konfigurationen, z. B. die Angabe von bestimmten Details für eine Tabelle pro Hierarchie (TPH), Zuordnung können nur mit der Fluent-API erreicht werden.

Meine Empfehlung für Entwickler ist, wählen Sie den Stil, die, den Sie mögen. Wenn Sie Ihre Konfigurationen von der Entity Framework DbContext geäußert haben lieber, dann verwenden Sie die Fluent API. Wenn Sie mögen die Einfachheit der Anwendung von Attributen und kümmere mich nicht, nachdem die erste Code-Zuordnung-Logik in Ihren Klassen, verwenden von Datenanmerkungen. Wenn Sie ausgewählt haben, verwenden von Datenanmerkungen und kommen über eine Konfiguration, die ausgedrückt werden kann nur mit der Fluent-API, dann fügen Sie die Konfiguration fließend und verwenden Sie eine Kombination der Anmerkungen für Daten und Konfigurationen, fließend.

Kann ich Code zuerst mit einer vorhandenen Datenbank verwenden?

Absolut! Zwar das Standardverhalten für Code First (hilfreich) eine Datenbank für Sie erstellen, können Sie zeigen Sie auf eine vorhandene Datenbank mit eigene Verbindungszeichenfolge und Code erste verwenden. Es gibt einige internen Funktionen der erste Code, mit denen Sie die Datenbank als auch programmgesteuert angeben. Beispielsweise können Sie den DbContext-Konstruktor mit dem Namen einer Datenbank oder einer Datenbank-Verbindungszeichenfolge überladen. Sie können auch angeben, und sogar besonders anfertigen, DbContext ConnectionFactory-Typen (z. B. SqlConnectionFactory).

Sie müssen sicherstellen, dass die erste Code Conventions plus alle Konfigurationen, die Sie, genau hinzugefügt haben wie Ihre Klassen zugeordnet werden, die vorhandene Datenbank darstellen. Microsoft arbeitet auf ein Werkzeug, das Reverse Engineering einer Datenbank, können Sie in Klassen und Code erste fließend Konfigurationen, die einen großen Vorsprung bieten können. Erfahren Sie mehr über dieses Werkzeug in meinem Mai 2011 Blog Post, "schnell aussehen auf Reverse Engineer DB in Code erste Klassen" (bit.ly/lHJ2Or).

Wenn Sie den Speicherort angeben, vermeiden Sie die Schemavalidierung und Datenbankinitialisierung, die standardmäßig mit Code First DbContext tut. Sie können diese Funktion über Code erste Datenbankinitialisierung vollständig deaktivieren:

Database.SetInitializer<MyContext>(null)

Hier finden Sie mehr zu diesem Thema in der MSDN Data Developer Center-Artikel und Video, "Datenbank-Initialisierungen in Entity Framework 4.1" (msdn.microsoft.com/data/hh272552). Detaillierte Beispiele für Arbeiten mit der ConnectionFactory Klassen und DbContext Überladungen, achten Sie darauf, check out "Programming Entity Framework: Code-First"(O' Reilly Media, 2011), ein Buch, das ich mit Rowan Miller aus dem Code First Team zusammen.

Weitere Quellen

Es gibt viele Orte, um weitere Informationen zum Arbeiten mit Code ersten und DbContext. Im Entity Framework-Teamblog unter blogs.msdn.com/adonet ist gefüllt mit Anleitungen und Beispielen. Einige team Mitglieder-Blogs, wie Rowan Miller (romiller.com) und Arthur Vickers' (blog.oneunicorn.com/author/ajcvickers), sind Plätze zum Lesen über erweiterte Techniken. MSDN-Foren und StackOverflow.com weiterhin Plätze Lesen Themen oder stellen Ihre eigenen Fragen. Miller und ich schrieb vor kurzem zwei kurze Bücher, die oben genannten "Programming Entity Framework: Code-First"und" Entity Framework programmieren: DbContext"(O' Reilly Media, 2012). Sie können diese im gedruckten oder digitalen Format erhalten.

Es gibt keine Notwendigkeit zu kämpfen mit dem Versuch, Dinge auf Ihre eigene Abbildung.

Julie Lerman ist ein Microsoft MVP.NET Mentor und Berater, der lebt in den Bergen von Vermont. Finden Sie ihre Präsentation auf Daten zugreifen und andere Microsoft.NET-Themen-Benutzergruppen und Konferenzen auf der ganzen Welt. She Blogs auf thedatafarm.com/blog und ist der Autor von "Programming Entity Framework" (2010) und "Programming Entity Framework: Code-First"(2011), beide von O' Reilly Media. Folgen sie auf Twitter bei twitter.com/julielerman.

Dank der folgenden technischen Experten für die Überprüfung dieses Artikels: Mike Flasko und Diego Vega