Entity Framework 4 – Lehrgang und meine “Erfahrungen”


Ich arbeite zwar schon eine ganze Weile mit EF, aber mein bisheriges Wissen bestand zum Großteil aus Wissen was ich mir beim Problemlösen angeeignet habe. Die letzte Woche hatte ich jetzt das Vergnügen an einem MOC Kurs von MS über das Entity Framework teilzunehmen. Die Beispiele waren Teils sehr interessant, aber auch teilweise abschreckend die MS da in seiner Schulung verwendet.

Im folgenden werde ich teils nur ein Paar Stichpunkte nennen, damit ich die Ideen dahinter nicht “vergesse” und evtl. helfe ich dem einen oder anderen auch dabei, wenn ich meine “Gedanken” zu den einzelnen Themen kurz anreise, nur um zu wissen wo nach man bei Google evtl. suchen muss. Es ist durchaus möglich das hier einige Themen bereits “veraltet” sind, da der Lehrgang nur auf EF4 eingeht und nur mit dem “ObjectContext” gearbeitet wird.

Bisher habe ich EF meist in Webprojekten verwendet und hier ist die Lebensdauer eines ObjectContextes nur so lange wie ein Request. Daher fallen hier einem einige Features die EF zu bieten hat gar nicht auf. Dazu gehört z.B. das Change Tracking bzw. das Vorhalten der Daten im EF, wenn diese einmal abgerufen wurden. Diese “neuen” Möglichkeiten können einen aber auch vor Probleme stellen, denn man muss von Anwendung zu Anwendung selbst entscheiden wann die Daten nur aus dem Cache (Context) geladen werden sollen und wann sollen diese frisch aus der DB geladen werden.

ObjectQuery Objekt

Ein wichtiges Element ist hier das “ObjectQuery” hier kann man bei Abfragen festlegen ob die Daten im EF Context überschrieben werden sollen, nur die Änderungen behalten werden oder ob z.B. gar keine Änderungen “NoTracking” gemerkt werden sollen (die Objekte werden vom Context “abgehängt”).

// Create a query from the entityset
ObjectQuery contacts = entities.Contacts;
contacts.MergeOption = MergeOption.NoTracking;

// Define the query
var query = from c in contacts select c;

Weitere Möglichkeiten zum Abfragen von Daten

  • Entity SQL Syntax um z.B. dynamische Abfragen zur Laufzeit zu generieren. Dabei werden Abfragen als String erstellt. Die Syntax sieht der von SQL sehr ähnlich, es werden aber die EntitySets abgefragt. Auch hier wird wieder das “ObjectQuery” Objekt verwendet
// Define the Entity SQL query
var queryString = "SELECT VALUE r from AWorksEntities.Contacts as r WHERE r.ContactID=@contactID";

// Create the query
var query = new ObjectQuery(queryString, entities);
query.MergeOption = MergeOption.OverwriteChanges;

// Add the paramenters
query.Parameters.Add(new ObjectParameter("contactID", contactID));

// Execute the query
List results = query.ToList();
  • Mit “Dynamic Linq” (Expression Trees) lassen sich auch dynamische Abfragen zur Laufzeit erstellen.
  • Stored Procedures können ebenfalls von der DB eingebunden und als Funktionen verwendet werden. Damit diese aber auch als Funktion angelegt werden, müssen diese nach dem Import erst noch für das “Model Freigegeben” werden. Dazu muss man in den Modelbrowser wechseln und im “Store” unter gespeicherte Prozeduren die passende Prozedur heraussuchen. Auch zum Speichern, Updaten oder Löschen können direkt Stored Procedures verwendet werden, diese lassen sich in den Mapping Details zur jeweiligen Klasse festlegen.

image

und mit der rechten Maustaste auf die gewünschte Prozedur gehen und “Funktionsimport hinzufügen” auswählen.

image

Im Fenster dann den Namen der Funktion festlegen, die zugehörige Stored Procedure auswählen und einen Rückgabewert auswählen den die Prozedur liefert. Jetzt kann man einfach über den Context auf die Funktion zugreifen

image

int anz = (int)entities.CountOrders(contactID).First();
  • Refresh von Datensätzen mit der Option ob die Daten aus der DB gewinnen oder die vom Client behalten werden.
entities.Refresh(RefreshMode.StoreWins, contact);
  • Prüfen ob sich einzelne Datensätze geändert haben im Model, dafür muss für jedes Einzelne Property die Eigenschaft “Parallelitätsmodus” (Concurrency Mode) von None auf Fixed gesetzt werden. Dies muss für jedes einzelne Property gesetzt werden welches wir bei Updatekonflikten überwachen wollen.
    Wenn wir das Property auf Fixed gesetzt haben und wir einen DS speichern bei dem ein Konflikt auftritt, wird eine “OptimisticConcurrencyException” geworfen die wir dann auswerten können, z.B. über ein Refresh des Entities lässt sich dieser Konflikt lösen.

image

  • Immer wenn wir SaveChanges aufrufen wird der komplette Speichervorgang für den aktuellen Context in einer Transaktion ausgeführt. Wenn man aber z.B. mehrere Contexte hat die man in einer Transaktion speichern möchte kann man den so genannten “TransactionScope” verwenden, welcher bei einem Fehler eine “TransactionAbordedException” wirft.

Performance von Abfragen “verbessern”

  • Verwenden von “Compiled Queries” um die Queries vorzucompilieren, lohnt sich aber nur, wenn es sich um complexe Queries handelt und wenn man diese nicht nur einmal im aktuellen Context verwendet.
  • Verwenden von “Compiled Views”, damit lassen sich auch die Views optimieren. Der Vorgang muss im Pre-Build des Projektes stattfinden wo sich die edmx Datei befindet. Dazu wird das Tool edmgen.exe verwendet.
  • Verwenden von Eager Loading mit Linq. Dazu muss Lazyloading für den context deaktiviert sein. Dann kann man direkt mit “.Include(“Contacts”) direkte Abhängigkeiten eines Objektes bei Bedarf mit laden.

Allgemein

  • In N-Tier Anwendungen, versenden von Daten z.B. per “Self-Tracking-Entity”, hier muss Lazyloading ausgestellt werden, da ein Serialisierer im schlimmsten Fall die Komplette DB Serialisiert.
  • Synch Framework kann zum Synchronisieren von Client Serverdaten verwenden werden.
  • WCF Data Services für EF, hier werden Abfragen per REST gestellt und Abfragen sind über einfache URL Parameter möglich
Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s