SQL Practice Blog – SQL Server, BizTalk und .NET Erfahrungen

Entity Framework: Der Einsatz von Updatable Views

with one comment

Ich stand heute vor dem Problem, das ich eine View in das Entity Framework integrieren musste. An sich ist das kein großen Problem, solang man die View nur zu Abfragezwecken benötigt. Möchte man jedoch auch ein Update, Insert oder Delete auf die View ausführen, so kommt man ohne manuelle Änderungen in der EDMX Datei schnell an seine Grenzen. Richtig problematisch wird es erst, wenn die View nicht nur eine Tabelle abfragt, sondern sich über zwei oder mehr Tabellen erstreckt.
Ich möchte an dieser Stelle eine prinzipielle Lösung zeigen wie man eine einfache View updatable macht und danach aufzeigen wie man das Problem mit einer komplexeren View über mehrere Tabellen löst.

Das Datenbankmodell

Ich habe mir für dieses Beispiel eine sehr einfach Datenbankstruktur geschaffen. Als Beispiel muss eine Kunden – Kundendetails 1:1 Beziehung herhalten. Die Tabellen haben auch je nur zwei Felder, was aber ausreichend ist um das Prinzip zu erklären.

image

Die einfache View

Als erstes werde ich das Beispiel mit einer einfachen View erläutern, welche alle Spalten der Tabelle Customer abfragt. Die Tabelle CustomerDetails wird vorerst nicht beachtet.

image

Als nächstes muss mit dem Visual Studio ein neues Projekt (Commandline reicht vollkommen aus) erzeugt werden. Hier wird nun ein neues Entity Framework Data Model hinzugefügt, nennen wir es CRM, welches aus der Datenbank heraus generiert wird. Wir fügen im folgenden Assistenten die View vwSimpleCustomer dem Entity Data Model hinzu.

Änderungen im EDMX

Als nächstes müssen wir ein paar Änderungen in der EDMX Datei vornehmen, damit wir später auf die View Create Update und Delete (CUD) Anweisungen absetzen können. Hierzu öffnen wir die Entity Framework Datei in dem mit Visual Studio mitgelieferten XML Editor.
In der EDMX Datei müssen wir die Bereiche des StorageModels und des ConceptualModels bearbeiten. Unsere View ist im StorageModel wie folgt definiert:

image

Nach unseren Anpassungen schaut es schon etwas anders aus.

image

  1. Wir haben den store:Type von Views auf Tables geändert. Somit behandelt er die View von nun an wie eine Tabelle.
  2. Wir haben bei store:Schema=”dbo” den prefix store: entfernt
  3. Wir haben das Attribut store:Name komplett entfernt
  4. Wir haben das Element DefinfingQuery komplett entfernt, da die View von nun an wie eine Tabelle genutzt wird

Als nächstes muss den EntityType der View anpassen. Hier werden vom Entity Framework beim anlegen der View alle Felder als PrimaryKey Felder deklariert. Dies muss geändert werden, so das nur noch die Spalte ID als PrimaryKey angegeben ist.

imageUnd danach schaut es so aus:

image 

Das gleiche muss auch noch im EntityType der View im ConceptualModel der EDMX Datei angepasst werden. Danach haben wir eine View welche mit CUD Anweisungen umgehen kann.

Die komplexere View

Die komplexere View wird sich nun über beide Tabellen erstrecken. Die Anpassungen in der EDMX Datei sind genau die gleich wie auch bei der einfachen View.
Versucht man jedoch ein Update, Insert oder Delete auf eine View, die sich über mehrere Tabellen erstreckt, auszuführen, so erhält man eine Exception mit dem Hinweis das dies nicht möglich ist.

Die Lösung ist relativ einfach. Man legt sich für jede CUD Anweisung im SQL Server eine Stored Procedure an. Diese Stored Procedures werden dann unter Function Mapping der View der jeweiligen CUD Anweisung zugewiesen.

image

Fazit

Das ganze ist leider nur eine sehr temporäre Lösung, das die EDMX Datei beim nächsten Update des Models aus der Datenbank heraus aktualisiert und überschrieben wird. Somit erkennt er zum Beispiel das die View ja gar keine Tabelle ist🙂

Man sollte sich auf jedenfall überlegen anstatt mit Views lieber mit richtigen Tabellen zu arbeiten. Manchmal lässt es jedoch eine gewachsene Struktur noch zu, direkt mit den Tabellen zu arbeiten. In diesem Fall findet Ihr in diesem Blog Post einen Lösungsansatz.

Written by Robert Meyer

Juli 16, 2010 um 16:08

Veröffentlicht in Entity Framework

Tagged with , , , ,

Eine Antwort

Subscribe to comments with RSS.

  1. Keine dauerhafte Lösung, aber kurze und treffende Beschreibung des Dilemmas „EF und Views“.

    Eine relationale DB ist ohne Views unbrauchbar. Da ich aber über SL4 die RIA-Services nutze, bin ich leider auf dieses verdammte EF angewiesen.

    Wolfgang

    Juli 23, 2011 at 14:38


Schreibe einen Kommentar

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

%d Bloggern gefällt das: