Was kam zuerst? Die relationale Datenbank, das objektorientierte Klassenmodell oder der ORM Mapper?
Die ältere Fraktion, zu der ich zumindest in Zeiteinheiten gehöre, findet sich in RDMBS, Normalisierung und Indizes wieder. Newcomer sehen alles dynamisch, freuen sich über JSON und stecken alles in NoSQL.
Die folgende Schritt-für-Schritt-Anleitung zeigt den sogenannten Code First-Ansatz. Damit legt man die Verantwortung für das Datenbank-Modell in die Hände von Programmierern. Mit Entity Framework und Migrations erstellt sich dann die Datenbank quasi automatisch.
Eigentlich ist es völlig egal, welcher Projekttyp oder Sprache in Visual Studio 2013 gewählt wird. Hier setzen wir ein Webforms VB.NET Projekt ein.
Wer Code First betreibt, sollte sich zuerst mit den Konventionen vertraut machen. Identity-Felder werden mit ID benannt. Am besten nutzen wir den Typ Integer. Foreign Keys erhalten den Tabellennamen und den Zusatz ID als Feldnamen. Mit Attributen nimmt man auf die späteren Feld-Definitionen im SQL Server Einfluss.
Am besten legt man die Klassen in das Model Verzeichnis. Die 1:1 Relation wird über die Eigenschaft in Zeile 22 erstellt. Für 1:n benötigen wir eine List of Property.
1: Imports System.ComponentModel.DataAnnotations
2:
3: Public Class room
4: <Key>
5: Public Property roomId As Integer
6: <MaxLength(50)>
7: Public Property roomname As String
8: Public Property datum As DateTime
9: Public Property isclosed As Boolean
10: End Class
11:
12:
13: Public Class chatmessage
14: <Key>
15: Public Property Id As Integer
16: <MaxLength(128)>
17: Public Property userId As String
18: Public Property roomId As Integer
19: Public Property Message As String
20: Public Property datum As DateTime
21:
22: Public Overridable Property room As room
23: End Class
Zusätzlich benötigen wir mit EF 6 eine vom DBContext abgeleitete Klasse, die wiederum auf die Klassen room und Chatmessage verweist.
1: Imports System.Data.Entity
2:
3: Public Class modellContext
4: Inherits DbContext
5:
6: Public Sub New()
7: MyBase.New("name=modellContext")
8: End Sub
9:
10: Public Property chatmessage As System.Data.Entity.DbSet(Of chatmessage)
11: Public Property room As System.Data.Entity.DbSet(Of room)
12:
13: End Class
Als nächstes führen wir in der Visual Studio Nuget Paket Manager Console enable-Migrations mit dem Context aus.
Eine weitere Convention behandelt die Namensgebung des Connection String. Wir müssen diesen in der Web.config ident zur Klasse benennen.
1: <connectionStrings>
2: <add name="modellContext"
3: connectionString="Data Source=(LocalDb)\v11.0;
4: AttachDbFilename=|DataDirectory|\modell1.mdf;Initial Catalog=modell1;
5: Integrated Security=True"
6: providerName="System.Data.SqlClient" />
7: </connectionStrings>
Jede Modellklasse fügen wir per add-Migration-Befehl dem Modell hinzu. Die Änderungen in der Datenbank lösen wir per update-Database aus.
Ist die Datenbank nicht vorhanden, legen wir sie an.
In LINQ Statements selektieren wir deshalb über Relationen hinweg aus den Daten.
1: Dim db As New modellContext
2: Dim r = db.chatmessage.Where(Function(c) c.room.roomname = "raum1")
Änderungen in der Klasse verteilen wir per add-migration und update Database in der Datenbank. So verlieren wir die Daten nicht. Dazu werden automatisch Migrationsklassen erzeugt, die eine Up und Down-Methode enthalten.
Damit gleichen wir auf jedem beliebigen Server jederzeit den Status des SQL Servers ab.
Auf diese Art können Sie Optimierungen der Datenbank ignorieren. Ob Sie einen Datenbank-Admin, der die entsprechende SQL Performance-Optimierung beherrscht, beauftragen oder einen EF-Spezialisten, hängt von vielen Faktoren ab. In jedem Fall bieten wir die passenden Schulungen dafür:
http://www.ppedv.de/schulung/kurse/AdoNetEF_Entity%20Framework_EntityDataModels_EDM_Framework_%204.0_WPF_WCF.aspx
http://www.ppedv.de/schulung/kurse/SQL-Performance-Optimierung-Sicherheit-Indizes-Verwaltung-Komprimierung-Verbesserung.aspx