3. 3
ADO.NET "in a Nutshell"
Page 5
using (DbConnection conn = new SqlConnection(
"Data Source=(LocalDb)v11.0;Initial Catalog=HotelDb;[…]"))
{
conn.Open();
using (DbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select * from Hotel where RegionId = 3";
using (DbDataReader r = cmd.ExecuteReader())
{
while (r.Read())
{
Console.WriteLine(r["Bezeichnung"]);
}
}
}
}
Entity Framework
•O/R-Mapper
•Datenbankunabhängigkeit
•Abfragen via LINQ
5. 5
Spielarten
Folie 9
• Model First
• DB First
Mapping via XML
• Code First
• Code First mit Reverse Engineering
Mapping via Code
Code First erscheint überlegen
Folie 10
Sowohl DB-First
als auch Model-
First möglich
Quellcode-
verwaltung
Für Entwickler
intuitiver
Mehr Freiheiten
für Entwickler
Code-
Konfiguration zur
Laufzeit
Konventionen
Migrations
8. 8
Ziele
Reichweite
• .NET Core, WinRT
• NoSQL
Aufräumen
• Code First
• RIP ObjectContext
Folie 15
Nicht-Ziele
Folie 16
• Ja, aber nur wo es sinnvoll
ist
API-
Änderungen
• Ja, aber Unterschiede zu
RDBMS sollen nicht durch
Abstraktion verborgen
werden
NoSQL
10. 10
Funktionsumfang
Folie 19
EF 6
EF 7.x+
Einige Einschränkungen in 7.0
M:N-Beziehungen
Vorerst mit jeweils zwei 1:N-Beziehungen modellieren
Lazy Loading
Vererbungsbeziehungen nur eingeschränkt
Komplexe Typen
Validieren vor dem Speichern
Validierung findet nur in DB statt
Eigene Konventionen
Keine Stored Procedures
11. 11
7.0 oder 6.x
Web mit
.NET Core
EF 7.0
Mobile EF 7.0
Sonst EF 6.0
Code Only
MODELL ERSTELLEN
Page 22
13. 13
Entitäten
public class Hotel
{
public int HotelId { get; set; }
public string Bezeichnung { get; set; }
public int Sterne { get; set; }
public int RegionId { get; set; }
public Region Region { get; set; }
}
Konvention für FK:
- PK der anderen Seite (RegionId)
- Navigationseigenschaft+PK (RegionRegionId)
- Typ+PK (RegionRegionId)
Context
Folie 26
public class HotelDbContext : DbContext
{
public DbSet<Hotel> Hotels { get; set; }
public DbSet<HotelBuchung> HotelBuchungen { get; set; }
public DbSet<Region> Region { get; internal set; }
protected override void
OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(
@"Data Source=(localdb)ProjectsV12;[…]");
}
}
15. 15
OBJEKTE ABRUFEN
Objekte laden
using (var ctx = new HotelDbContext())
{
var regionen = ctx
.Region
.Where(r => r.Name == "Hamburg")
.OrderBy(r => r.Name)
.ToList();
[…]
}
16. 16
OBJEKTE MANIPULIEREN
Objekte anlegen
Benachbarte Objekte werden in EF 7
im Gegensatz zu EF 6 nicht automatisch eingefügt
public void Insert(Hotel h)
{
using (var ctx = new HotelDbContext())
{
ctx.Hotel.Add(h);
ctx.SaveChanges();
}
}
17. 17
Überwachen von Objekten
DbContext überwacht sämtliche ihm bekannten Objekte auf
Änderungen
Neu hinzugefügt Objekte
Geladene Objekte
Dazu kommt Dirty Checking zum Einsatz
SaveChanges überträgt diese Änderungen in die DB
using(var ctx = new HotelDbContext()) {
Hotel h = new Hotel();
h.Bezeichnung = "Hotel Mama";
h.RegionId = 3;
h.Sterne = 4;
ctx.Hotel.Add(h);
ctx.SaveChanges();
h.Sterne++;
ctx.SaveChanges();
}
Objekte anlegen
Ab hier ist h abgehängt (detached)
18. 18
Abgehängte Objekte aktualisieren
Benachbarte Objekte werden
nicht angehängt oder aktualisiert
public void Update(Hotel h)
{
using (var ctx = new HotelDbContext())
{
ctx.Hotel.Update(h);
ctx.SaveChanges();
}
}
DEMO
Page 36
19. 19
KONVENTIONEN ÜBER
FLUENT-API ANPASSEN
Page 37
OnModelCreating
Page 38
public class HotelContext : DbContext
{
[…]
protected override void OnModelCreating(
ModelBuilder modelBuilder)
{
[…]
}
}
20. 20
DEMO
Page 39
Fazit
O/R-Mapping automatisiert monotone Aufgaben
Vereint Vorteile von OO und RDBMS
Frühjahresputz mit Version 7
Entfernen von Altlasten und Mehrgleisigkeiten
Zeitpunkt passend vor Hintergrund von .NET Core
Reichweite wird erhöht: WinRT und NoSQL
Folie 40