Datenpunkte

Verbesserungen an Entity Framework Designer in Visual Studio 2012

Julie Lerman

 

Julie LermanIch muss zugeben, dass ich von der Verwendung von Code First für das Erstellen von Domänenmodellen, die Entity Framework verwenden kann, ziemlich begeistert bin. Und ich habe EDMX-Modellen, die mithilfe von Entity Framework Designer entweder über Database First oder Model First erstellt werden können, bisher keine große Aufmerksamkeit geschenkt (lesen Sie dazu meine Kolumne im Mai 2011, „Die Enträtselung der Entity Framework-Strategien: Workflow für die Modellerstellung“ [msdn.microsoft.com/magazine/hh148150], um mehr über die Unterschiede zwischen Code First, Model First und Database First zu erfahren.)

Aber damals zählte für mich nur der Designer. Sind Sie bereit für einen „Ich bin so alt“-Witz? Ich bin so alt, dass ich Entity Framework verwendete, als man mit XML-Rohdaten arbeiten musste, weil es keinen Designer gab. Das ist wahr. Das war in der Zeit der frühen Betaversionen vor der ersten Version. Daher war der Designer, der in Visual Studio 2008 eingeführt wurde, ein wahrer Segen. Microsoft hat exzellente Arbeit geleistet, obwohl es natürlich immer leicht ist, Dinge zu finden, die man hätte besser machen können, oder sich darüber zu beklagen, was fehlt. In Visual Studio 2010 erhielten wir die Unterstützung für Model First und einige andere nette Features im Designer, wie z. B. die Pluralisierungs- und Fremdschlüsselunterstützung.

Visual Studio 2012 stellt jetzt einen nochmals verbesserten Designer bereit. Es gibt zwei größere Änderungen aber auch eine ganze Reihe kleinerer Anpassungen, die einem die Arbeit erleichtern und ein Lächeln auf mein Gesicht zaubern – auf Ihres hoffentlich auch.

1, 2, 3, Farbe!

Sie haben vielleicht bereits von einer bemerkenswerten Verbesserung gehört: der Fähigkeit, im Designer Farben zu den Entitäten hinzuzufügen. Und das ist ein ganz einfach zu verwendendes Feature. Sie können eine oder mehrere Entitäten auswählen und anschließend im Eigenschaftenfenster eine Farbe für diese Entitäten wählen, wie in Abbildung 1 gezeigt. Farbe eignet sich hervorragend, um Entitäten visuell zu kennzeichnen. Wenn Sie ein Modell öffnen, ist es so leicht zu erkennen, dass bestimmte Entitäten mit anderen innerhalb des Modells zusammenhängen. Selbst in einem kleinen Modell wie in Abbildung 2 ist klar zu sehen, wie hilfreich dies sein kann.

Changing the Color of Entities
Abbildung 1: Ändern der Farbe von Entitäten

Easily Visualize Entity Groupings with Color
Abbildung 2: Einfaches Visualisieren von Entitätsgruppen mit Farbe

Mit Diagrammen organisieren

Es wird viel darüber diskutiert, wie viele Entitäten für ein Modell maximal vertretbar sind. Für mein Gehirn sind mehr als 20 oder 30 Entitäten in einem einzigen Modell visuell und physisch nicht verwaltbar. Ich meine damit, dass es visuell schwierig ist, diese ganzen Informationen auf einmal zu erfassen, und wenn ich an einer oder mehreren Entitäten im Designer arbeiten möchte, kann dies sehr umständlich sein. Ich greife oft auf den Modellbrowser des Designers zurück, um eine Entität auf der Entwurfsoberfläche zu finden. Bei riesigen Modellen (mit hunderten Entitäten – was ich persönlich niemals ausprobieren würde), können Probleme hinsichtlich der Entwurfszeit- und Laufzeitleistung auftreten (siehe das Microsoft Data Developer Center-Thema „Leistungsüberlegungen für Entity Framework 5“ unter bit.ly/OZTiUL.) Es gibt EDMX-Designer anderer Anbieter, die dieses Problem überwinden, indem ein anderer Ansatz für das Arbeiten mit großen Modellen verwendet wird. Ich erstelle lieber kleine Modelle zur Verwendung in meinen gesamten Apps, aber das ist nicht immer möglich. Es ist wichtig, die Möglichkeit zu haben, viele Entitäten in einem einzigen Model im Designer verwalten zu können.

Der neue Designer hilft Entwicklern bei diesem Problem, indem ein häufig nachgefragtes Feature bereitgestellt wird: Diagramme. Mit Modelldiagrammen können Sie verschiedene Entwurfszeitansichten davon erstellen, was das Modell enthält. Möglicherweise möchten Sie eine Ansicht, die das gesamte Modell wie in Abbildung 2 anzeigt, und dann zusätzliche Diagramme verwenden, um verschiedene Gruppierungsmöglichkeiten der Entitäten darzustellen. Der Designer stellt eine Reihe von Verfahren für das Erstellen von Diagrammen bereit. Seien Sie jedoch vorsichtig bei Funktionen, mit denen eine Entität verschoben statt dupliziert wird.

Nehmen wir an, ich möchte ein Diagramm, das nur die Entitäten darstellt, die ich benötige, um mich hauptsächlich mit der Kundenverwaltung zur Entwurfszeit zu befassen. Diese könnten in diesem bestimmten Modell „Customer“ und „ShippingAddresses“ sein. Dafür bieten sich mehrere Verfahren an. Eine Möglichkeit besteht darin, diese Entitäten auszuwählen, mit der rechten Maustaste auf sie zu klicken und im Kontextmenü die Option „Zu einem neuen Diagramm verschieben“ auszuwählen. Dadurch wird ein neues Diagramm nur mit diesen beiden Entitäten erstellt, wie in Abbildung 3 angezeigt. Da ich jedoch die Option zum Verschieben verwendet habe, werden diese beiden Entitäten aus dem Hauptdiagramm entfernt. Darauf müssen Sie achten, wenn Sie ein Diagramm des Gesamtmodells beibehalten möchten. Dass das Diagramm keine Spiegelung des Modellschemas ist, gefällt mir insofern als man die Navigationseigenschaften sehen kann (z. B. Customer.Orders), obwohl in diesem speziellen Diagramm die Entität „Orders“ nicht sichtbar ist.

Diagram Created Using the Move to New Diagram Feature
Abbildung 3: Mit dem Feature „Zu einem neuen Diagramm verschieben“ erstelltes Diagramm

Sie können auch Diagramme über den Modellbrowser des Designers erstellen und verwalten, wie in Abbildung 4 dargestellt. Über den Modellbrowser können Sie das anzuzeigende Diagramm auswählen sowie Diagramme hinzufügen und löschen. Außerdem können Sie Entitäten von dem Modell (z. B. im Abschnitt „Entitätstypen“ von Company­DatabaseModel) auf die Diagrammoberfläche ziehen. Wenn ich möchte, dass „Customer“ und „ShippingAddress“ auf Diagramm 1 verbleiben, könnte ich ein neues Diagramm über den Modellbrowser erstellen und dann „Customer“ und „ShippingAddress“ auf die Oberfläche ziehen. 

Manage Diagrams from the Model Browser
Abbildung 4: Diagramme über den Modellbrowser verwalten

Außerdem können Sie Entitäten aus einem Diagramm kopieren und in ein anderes einfügen, wobei alle relevanten Zuordnungen ebenfalls kopiert werden.

Denken Sie daran, dass die Diagramme Entwurfszeitansichten sind – sie definieren nicht das vollständige Modell. Sie können das vollständige Modell immer im Modellbrowser ansehen. Daher hat die Duplizierung von Entitäten von einem Diagramm in ein anderes keine Auswirkungen auf Ihr Modell oder Ihre Anwendung. Es sind jedoch keine schreibgeschützten Ansichten. Sie können Ihr Modell und Ihre Entitäten in diesen Diagrammen entwerfen, und diese Änderungen wirken sich auf das zugrunde liegende Modell aus. Außerdem gefällt mir, dass man mit der rechten Maustaste auf jede Entität in einem Diagramm klicken und die Option „Zugehörige einschließen“ wählen kann, um alle direkt zugehörigen Entitäten abzurufen.

Standardmäßige Codeerstellung: POCOs und DbContext

Eine weitere Änderung, die mich erfreute, als ich sie zum ersten Mal entdeckte, besteht darin, dass der Assistent für das Erstellen eines neuen Entity Data Models jetzt standardmäßig die DbContext-T4-Vorlage für Entity Framework 5 verwendet. Seit der Version Entity Framework 4.1 (die Code First und die DbContext-API enthielt) empfiehlt das EF-Team, dass Entwickler neue Projekte mit den DbContext- und Plain Old CLR Object (POCO)-Klassen statt mit .NET 4-ObjectContext und Klassen, die von EntityObject erben, beginnen. Aber Visual Studio 2010 verwendete eine Codegenerierungsvorlage, die standardmäßig ObjectContext und Entity­Objects verwendete. Es war Entwicklern überlassen, das EntityFramework.dll NuGet-Paket zu installieren und ihr EDMX zu wechseln, um die DbContext-Vorlage zu verwenden. Das heißt, dass man die neuen Anleitungen berücksichtigen und danach handeln musste.

Der Designer verwendet jetzt standardmäßig die DbContext Generator-Vorlage von EF 5.x und erstellt eine DbContext-Klasse und POCOs, die sehr viel einfacher in Ihren Apps zu verwenden sind als frühere Typen. Der Assistent ruft außerdem die Referenz zu EntityFramework.dll ab, die auf Ihrem Computer zusammen mit Visual Studio 2012 installiert ist, sodass Sie nicht einmal eine Internetverbindung benötigen.

Sie können alternativ problemlos ObjectContext verwenden. Lesen Sie dazu das Microsoft Data Developer Center-Thema „Zurückkehren zu ObjectContext-Codegenerierung“ unter bit.ly/OFjcLa.

Definieren von Enumerationstypen

Microsoft .NET Framework 4.5 stellt die Unterstützung von Enumerationen für Entity Framework bereit. Sie können Enumerationen mit EDMX und Code First verwenden. Mit EDMX müssen Sie dafür sorgen, dass das Modell die Enumerationstypen beachtet, damit es Entity Framework möglich ist, sie umzuwandeln, um sie Datenbanktypen zuzuordnen. Mit dem Entity Framework-Designer ist das ziemlich einfach durchzuführen.

Wenn Sie ein Reverse-Engineering einer Datenbank in ein EDMX-Modell durchführen, interpretiert der Assistent Datenbankspalten als .NET-Typen. Anschließend müssen Sie Ihre Enumerationstypen definieren und Eigenschaften bearbeiten. Sehen wir uns diesen Prozess kurz an.

Die Entität „Return“ in meinem Modell hat die Eigenschaft „Reason“, die einer ganzen Zahl zugeordnet ist. Ich möchte „Reason“ als Enumeration darstellen, anstatt eine zusätzliche Datenbanktabelle und Entität zu haben, und ich kann diese Änderung im Designer durchführen. Klicken Sie mit der rechten Maustaste auf den Designer-Hintergrund. Unter „Neu hinzufügen“ wird „Enumerationstyp“ als neues Element in der Liste angezeigt. Wählen Sie dieses Element aus, um den Enumerationstyp-Assistenten zu starten, in dem Sie die Enumeration wie in Abbildung 5 angezeigt definieren können. Enumerationstypen sind auf der Designer-Oberfläche nicht sichtbar, aber Sie können im Modellbrowser jederzeit auf sie zugreifen (zum Anzeigen, Bearbeiten oder Löschen).

Defining an Enum Type
Abbildung 5: Definieren eines Enumerationstyps

Da das Modell jetzt diesen Enumerationstyp berücksichtigt, kann ich ihn in meinen Entitäten verwenden. Ich kehre zur Entität „Return“ zurück und bearbeite die Eigenschaften der Eigenschaft „Reason“. Der Typ war ursprünglich Int32. Der neue Enumerationstyp wird in der Dropdownliste „Typ“ angezeigt, wie in Abbildung 6 dargestellt, aber Sie müssen ganz nach unten scrollen, um ihn zu finden. Nachdem Sie diesen Typ ausgewählt haben, ist Entity Framework in der Lage, eine Enumeration in einen Datenbankwert umzuwandeln, wenn Sie LINQ-Abfragen schreiben, Daten abrufen oder Daten aktualisieren.

Selecting a New Enum Type
Abbildung 6: Auswählen eines neuen Enumerationstyps

Im Folgenden sehen Sie eine LINQ-Abfrage, die nach der Enumeration „ReturnReason“ filtert:

var returns = context.Returns.Where(
  r => r.Reason == ReturnReason.Broken).ToList();

Wenn die Abfrage in der Datenbank ausgeführt wird, wird die Enumeration „Broken“ in den Enumerationswert 3 umgewandelt, wie in diesem TSQL-Teil zu sehen ist:

    WHERE 3 =  CAST( [Extent1].[Reason] AS int)

Vielleicht sind Ihnen die Kontrollkästchen „Flags-Attribut festlegen“ und „Verweis auf externen Typ“ in Abbildung 5 aufgefallen. Entity Framework unterstützt bitweise Enumerationen, was es Ihnen ermöglicht, Enumerationen beim Festlegen oder Abfragen von Daten zu kombinieren. „Flags-Attribut festlegen“ gibt an, dass die Enumeration bitweise sein wird. Pawel Kadluczka vom EF-Team hat den hervorragenden Blogbeitrag „Verwenden vorhandener Enumerationstypen in Entity Framework 5“ (bit.ly/QIUz6y), in dem die Funktionen des Kontrollkästchens „Verweis auf externen Typ“ ausführlich beschrieben werden.

Beachten Sie, dass zum Zeitpunkt, zu dem dieser Artikel verfasst wird, WCF Data Services 5 Enumerationstypen nicht erkennt. Lesen Sie mehr über dieses Problem im Blog des WCF Data Services-Teams unter blogs.msdn.com/astoriateam.

Stapelimport von gespeicherten Prozeduren

Abbildung 7 zeigt ein anderes Feature, das ich mir schon lange gewünscht habe, und ich habe mich sehr gefreut, es im Entitätsdatenmodell-Assistenten in Visual Studio 2012 vorzufinden. Der Designer in Visual Studio 2010 ermöglicht es Ihnen, gespeicherte Prozeduren komplexen Typen zuzuordnen, aber dies kann immer nur mit einer gespeicherten Prozedur nach der anderen durchgeführt werden. Dieses Feature ist immer noch vorhanden, aber jetzt gibt es eine schnellere Lösung. Beim Erstellen eines Database First-Modells kann der Assistent die Funktionen aus den gespeicherten Prozeduren alle auf einmal erstellen. Außerdem erstellt der Assistent die erforderlichen komplexen Typen, denen die Funktionen zugeordnet werden.

Creating Function Imports from Stored Procedures
Abbildung 7: Erstellen von Funktionsimporten aus gespeicherten Prozeduren

Abbildung 8 zeigt die neuen Funktionsimporte und die zugehörigen komplexen Typen im Modellbrowser. Normalerweise verwende ich nicht gerne die vom Assistenten erstellten Standardnamen. Aber es ist immer noch schneller, diese Ressourcen für mich erstellen zu lassen und anschließend die Namen zu bearbeiten, als sie einzeln selbst zu erstellen.

The New Function Imports
Abbildung 8: Die neuen Funktionsimporte

Wenn Sie Funktionsimporte aus einigen der gespeicherten Prozeduren erstellen, aber Entitätszuordnungen aus anderen erstellen möchten (d. h. bei jedem Hinzufügen eines neuen Kontakts Insert­Contact verwenden und SaveChanges aufrufen), empfehle ich, dies in zwei Durchgängen zu erledigen. Im ersten Durchgang wählen Sie nur die gespeicherten Prozeduren, die als Funktionen importiert werden sollen, sowie die entsprechenden komplexen Typen aus. Anschließend können Sie mithilfe des Features „Modell aus der Datenbank aktualisieren“ die Prozeduren auswählen, die Sie zum Zuordnen verwenden möchten. Stellen Sie sicher, dass das Kontrollkästchen „Ausgewählte gespeicherte Prozeduren und Funktionen in das Entitätsmodell importieren“ bei diesem zweiten Durchgang nicht aktiviert ist.

TVF- und Geography-Unterstützung

EF 5 unterstützt die Zuordnung zu Tabellenfunktionen (TVFs) und räumlichen Daten (z. B. SqlGeography und SqlGeometry), und der Designer unterstützt diese Features auch. Informationen, wie mit dem Designer diese Zuordnungen genutzt werden können, finden Sie in den exemplarische Vorgehensweisen für TVFs und räumliche Datentypen unter bit.ly/QCppJJ und bit.ly/VdbEUP.

Wie bei der Enumerationsunterstützung sollten Sie beachten, dass WCF Data Services 5 keine Unterstützung für Geography-Typen bereitstellt, die Sie in Ihrem EF 5-Modell definieren können.

Es sind die kleinen Dinge

Der neue Entity Framework Designer enthält viele kleinere Verbesserungen, die insgesamt eine erhebliche Wirkung haben und die Benutzerfreundlichkeit des Designers erhöhen.

Eigenschaften verschieben Im Designer können Sie Eigenschaften in einer Entität neu organisieren, sodass sie in der von Ihnen bevorzugten Reihenfolge aufgelistet werden. In vorherigen Versionen konnte dies nur durch direktes Bearbeiten der XML erreicht werden.

Schema in Tabellenauswahl Wenn Sie ein Database First-Modell erstellen oder ein Modell aus der Datenbank aktualisieren, werden die Tabellen, Ansichten und andere Datenbankobjekte jetzt nach Schemaname organisiert. Wenn Sie sich die Mühe gemacht haben, Ihre Datenbankobjekte nach Schema zu organisieren, profitieren Sie hiervon, da Sie Objekte leichter lokalisieren können. Außerdem können Sie Objekte einfach löschen. die nicht Teil Ihrer Domäne sind, wie z. B. die dbp-Schematabellen in Abbildung 9.

Grouping Database Objects by Schema Name
Abbildung 9: Gruppieren von Datenbankobjekten nach Schemaname

Änderungen bei Spalten-Facets in Modellaktualisierung berücksichtigt Der Assistent „Modell aus der Datenbank aktualisieren“ knüpft jetzt an Änderungen bei den Spalten-Facets an (Skalierung, Genauigkeit, MaxLength, NULL-Werte zulassen, Unicode und FixedLength) und wendet sie auf die entsprechenden Eigenschaften in Ihrem Modell an. Diese Änderung wird von vielen Entwicklern begrüßt werden. Sie müssen jedoch weiterhin unterbrochene Zuordnungen reparieren, wenn Sie Änderungen an den Spaltentypen vornehmen. MSDN stellt eine umfassende Beschreibung der Effekte im Dokument „Durch den Assistenten für die Modellaktualisierung vorgenommene Änderungen an einer EDMX-Datei“ bereit (bit.ly/PTOwKB). Zum Zeitpunkt, zu dem dieser Beitrag verfasst wird, enthält der Abschnitt, in dem die Spaltenänderungen beschrieben werden, noch keine neuen Details über die Facets.

Zugehörige Entitäten bei Auswahl markieren Dies ist ein weiteres Highlight, das Sie beim Verständnis Ihres Modells unterstützen kann: Wenn Sie eine Entität oder Verknüpfung im Designer auswählen, werden die zugehörigen Entitäten ebenfalls markiert.

Ein Hinweis zum Element „Umgestalten“ im Kontextmenü Vorabversionen von Visual Studio 2012 enthielten ein Designer-Feature, das abhängigen Code umgestaltet, wenn Sie eine Entität oder Eigenschaft umbenennen. Das Feature fand keinen Eingang in die endgültige Version von Visual Studio 2012, aber es gibt ein paar Artefakte im Designer, die ein bisschen verwirrend sein können. Das Kontextmenü enthält das Element „Umgestalten“ mit „Umbenennen“ in einem Untermenü. Wenn Sie im Menü „Umgestalten“ die Option „Umbenennen“ auswählen, wird ein Fenster eingeblendet, in dem angegeben wird, dass kein Code geändert wird. Da die Umgestaltung nicht durchgeführt wird, listet dieses Fenster nie etwas auf.

Robuste Verbesserungen

Dieser Artikel konzentrierte sich auf neue Features des Entity Framework Designers in Visual Studio 2012. Es gibt aber noch weitere Verbesserungen in EF 5, die Sie nicht verpassen sollten. Am bemerkenswertesten ist die Verbesserung der zugrunde liegenden Leistung dank der neuen automatisch kompilierten Abfragen. Mehr hierzu erfahren Sie im Team-Blogbeitrag „Vorschau: Leistungsverbesserungen in Entity Framework 5.0“ (bit.ly/PLWu5l). Egal, ob Sie Ihre Modelle mithilfe von Entity Framework Designer erstellen oder Code First nutzen, um Ihre Modelle zu entwerfen: in EF 5 gibt es viel Aufregendes zu entdecken.

Julie Lerman ist Microsoft MVP, .NET-Mentor und Unternehmensberaterin und lebt in den Bergen von Vermont. Sie hält bei User Groups und Konferenzen in der ganzen Welt Vorträge zum Thema Datenzugriff und anderen Microsoft .NET-Themen. Julie Lerman führt unter thedatafarm.com/blog einen Blog. Sie ist die Verfasserin von „Programming Entity Framework“ (2010) sowie der Ausgaben „Code First“ (2011) und „DbContext“ (2012). Alle Ausgaben sind im Verlag O’Reilly Media erschienen. Folgen Sie ihr auf Twitter unter twitter.com/julielerman.

Unser Dank gilt dem folgenden technischen Experten für die Durchsicht dieses Artikels: Lawrence Jones