SlideShare une entreprise Scribd logo
1  sur  27
Télécharger pour lire hors ligne
O/R Mapper
O/R Mapper anhand von NHibernate & Entity Framework
Thomas Mentzel
März 2010
No. 2© Logica 2010. All rights reserved
Object-relational impedance mismatch
Mapping
Session
Abfragen
Agenda
Object-relational
impedance mismatch
No. 4© Logica 2010. All rights reserved
• Struktur
• Objekt enthält Daten und Verhalten
• Relationales Modell enthält ausschließlich Tupel (Daten)
• Identität
• Objekt hat zustandsunabhängige Identität
• Tupel enthalten Identität (Primärschlüssel)
• Datenkapselung
• Objekt schützt Daten vor Veränderung (Methoden/Setter)
• Tupel können beliebig geändert werden (im relationalen Sinne)
• Arbeitsweise
• Objekte sind Netzwerke interagierender Objekte. Kapselung durch Verhalten
• Relationale Datenbank arbeitet prozedural
Object-relational impedance mismatch
No. 5© Logica 2010. All rights reserved
Lösungsansätze
• Objektorientierte Datenbanken
• Kein “Mapping”
• Applikationsgebunden
• NoSQL
• Relationale Funktionen in Programmiersprache
• “Rückwärtslösung”
• Keine Objektorientierung
• InterSystems Cachè
• Objekt-Relationale Mapper
No. 6© Logica 2010. All rights reserved
Objekt-Relationale Mapper
• Abbildung der Tabellen auf Klassen
• Wer war zuerst? Die Henne oder das Ei?
• “Datenbank generiert Klassen” (DB zentriert) oder
• “Klassen generieren Datenbank” (OOD zentriert)
Mapping
No. 8© Logica 2010. All rights reserved
• Klassen/Eigenschaften
• Primärschlüssel/Zusammengesetzte Schlüssel
• Vererbung
• Löschweitergabe
• Änderungsverfolgung
Herausforderungen
No. 9© Logica 2010. All rights reserved
• XML (NHibernate, EntityFramework) bzw.
• Proprietäre Konfiguration
• Attribute (NDO)
• Code (FluentNHibernate)
Konfiguration
No. 10© Logica 2010. All rights reserved
• Klasse  Tabelle
• Eigenschaft  Spalten
• Objektreferenz  Klasse/Tabelle
• Listen  Klasse/Tabelle
• Komplexe Typen  Tabelle oder Spalten?
• Properties und Spalten nicht namensgleich
• Klassen und Tabellen nicht namensgleich
• Eine Klasse auf zwei Tabellen (Join)
Klassen und Eigenschaften
No. 11© Logica 2010. All rights reserved
• Objektidentität != Primärschlüssel
• Primärschlüssel Strategien
• int, auto int, GUID, fachlicher Schlüssel
• Composite Keys
• GetHashCode() & Equals()
• Fremdschlüsselverweise
• Eineindeutiges Objekt
*-Schlüssel
No. 12© Logica 2010. All rights reserved
NHibernate: Klassen-Mapping
No. 13© Logica 2010. All rights reserved
• Tabelle pro Vererbungshierarchie (Single Table)
• Vorteile: ID-Contraints
• Nachteile: Leere Spalten
• Tabelle pro Unterklasse (Joined)
• Vorteile: Tabellen bilden „Vererbungsstruktur“ ab
• Nachteile: Abstrakte Basisklasse „instanziierbar“, ID-Constraints beschränkt
• Tabelle pro konkrete Klasse (Table per Class)
• Vorteile: Keine „instanziierbare“ abstrakte Basisklasse
• Nachteile: Spalten der Basisklasse in allen Tabellen, keine ID-Constraints
Vererbung
No. 14© Logica 2010. All rights reserved
• Cascade Optionen
• <Bag … Cascade=„all-delete-orhpans“>
none, save-update, delete, delete-orphan, all, all-delete-orphan (NHibernate)
• <OnDelete Action="Cascade" /> (EntityFramework; SSDL & CSDL)
• Zirkuläre Referenzen
• Löschen von „Lookup“-Werten
• Wann ist ein Objekt ein „Orphan“ (Waise)
Löschweitergabe
No. 15© Logica 2010. All rights reserved
• Eigenschaften-Setter überwachen
• Klassen können den Status intern ändern (Fields)
• Unterschiedliche Strategien
• Eigenschaften mit INotifyPropertyChanged (EntityFramework)
• Dynamische Proxys (NHibernate)
• PostCompiler und Code Injection (NDO)
• POCO vs. ORM-Basisklasse
• NHibernate benutzt „Plain-Old-CLR-Objects“
• EntityFramework benutzt eine Basisklasse
Änderungsverfolgung
No. 16© Logica 2010. All rights reserved
EntityFramework: Generierte Klassen
Session
No. 18© Logica 2010. All rights reserved
• EntityFramework
• new Context(); // aka. Session
• NHibernate
• new Configuration().AddAssembly();
• new SessionFactory(); // ThreadSafe
• Session = SessionFactory.CreateSession(); // Non-ThreadSafe
„Session“
No. 19© Logica 2010. All rights reserved
• Identity Map [Fowler, P of EAA 195]
• IdentityMap per Session
• Jede Session liest Daten aus der Datenbank
• Context1.Person(id=1) != Context2.Person(id=1)
Caching der Objekte
No. 20© Logica 2010. All rights reserved
• Pro Aktion eine neue Session erstellen
• Singleton Session
Implementierungen
No. 21© Logica 2010. All rights reserved
• Lazy Loading
• Deferred Loading
• Eager Loading
• Design-Pattern zum Nachladen
• Lazy Initialization (Initialisieren bei Zugriff –“Singleton“)
• Virtual Proxy (Schnittstellen Dummy)
• Value Holder (Wrapper)
• Ghost (Partial Initialized)
• NHibernate: Lazy Loading/Eager Loading
• EntityFramework: Deferred Loading
• if (!Parent.Children.Loaded) Parent.Children.Load()
• Context.Parents.Include(„Children“)
*-Loading
Abfragen
No. 23© Logica 2010. All rights reserved
• Natives SQL
• IQuery sqlQuery = Session.CreateSQLQuery(someComplexQuery);
• IList<Person> people = sqlQuery.List<Person>();
• Proprietäre OO Abfragesprachen
• HQL (NHibernate)
• var query = „from Cat where Name=‚fritz„“;
• LINQ
• seit .NET 3.0
• SQL ähnlicher Syntax
• Linq2Objects
• Linq2SQL (Microsoft)
• Linq2EF (Microsoft)
• Linq2Hibernate (OpenSource)
• Eigene Ling-Provider
Abfragesprachen
No. 24© Logica 2010. All rights reserved
LINQ Magie
• Delayed Execution
• Abfrage erzeugt ExpressionTree
• Jedes (!) .ToList() führt eine
Datenbankabfrage aus (Linq2EF)
• query.Where().OrderBy().ToList() wird
in SQL umgewandelt
• query.ToList().Where().OrderBy() wird
auf dem Objektmodell ausgeführt
• Delayed Execution benötigt einen
Context
No. 25© Logica 2010. All rights reserved
• Warum führt jede „Abfrage“ auch ein SQL aus?
Die Session kennt doch die Daten!
Häufige Fragen
Fragen?
Thomas Mentzel
Email: thomas.mentzel@logica.com
MSN: thomas.mentzel@logica.com
Twitter: http://twitter.com/ThomasMentzel
Blog: http://thomas.mentzel.name
Vielen Dank
Thomas Mentzel

Contenu connexe

Plus de Thomas Mentzel

Sitzen ist das neue Rauchen - Kurzpräsentation
Sitzen ist das neue Rauchen - KurzpräsentationSitzen ist das neue Rauchen - Kurzpräsentation
Sitzen ist das neue Rauchen - KurzpräsentationThomas Mentzel
 
An Introduction to Clean Code Developer
An Introduction to Clean Code DeveloperAn Introduction to Clean Code Developer
An Introduction to Clean Code DeveloperThomas Mentzel
 
Word 2007 Einführung - Tag 04
Word 2007 Einführung - Tag 04Word 2007 Einführung - Tag 04
Word 2007 Einführung - Tag 04Thomas Mentzel
 
Word 2007 Einführung 03 - Tag 03
Word 2007 Einführung 03 - Tag 03Word 2007 Einführung 03 - Tag 03
Word 2007 Einführung 03 - Tag 03Thomas Mentzel
 
Word 2007 Einführung 02 - Tag 02
Word 2007 Einführung 02 - Tag 02Word 2007 Einführung 02 - Tag 02
Word 2007 Einführung 02 - Tag 02Thomas Mentzel
 
Word 2007 Einführung 01 - Tag 1
Word 2007 Einführung 01 - Tag 1Word 2007 Einführung 01 - Tag 1
Word 2007 Einführung 01 - Tag 1Thomas Mentzel
 
Word 2007 Einführung 00 - Agenda
Word 2007 Einführung 00 - AgendaWord 2007 Einführung 00 - Agenda
Word 2007 Einführung 00 - AgendaThomas Mentzel
 
Productivity- and Self Management
Productivity- and Self ManagementProductivity- and Self Management
Productivity- and Self ManagementThomas Mentzel
 
Einführung Team Foundation Server 2010
Einführung Team Foundation Server 2010Einführung Team Foundation Server 2010
Einführung Team Foundation Server 2010Thomas Mentzel
 
Varianten des "Observer Pattern"
Varianten des "Observer Pattern"Varianten des "Observer Pattern"
Varianten des "Observer Pattern"Thomas Mentzel
 
10000 Schritte - Was steckt dahinter
10000 Schritte - Was steckt dahinter10000 Schritte - Was steckt dahinter
10000 Schritte - Was steckt dahinterThomas Mentzel
 

Plus de Thomas Mentzel (13)

Sitzen ist das neue Rauchen - Kurzpräsentation
Sitzen ist das neue Rauchen - KurzpräsentationSitzen ist das neue Rauchen - Kurzpräsentation
Sitzen ist das neue Rauchen - Kurzpräsentation
 
An Introduction to Clean Code Developer
An Introduction to Clean Code DeveloperAn Introduction to Clean Code Developer
An Introduction to Clean Code Developer
 
Word 2007 Einführung - Tag 04
Word 2007 Einführung - Tag 04Word 2007 Einführung - Tag 04
Word 2007 Einführung - Tag 04
 
Word 2007 Einführung 03 - Tag 03
Word 2007 Einführung 03 - Tag 03Word 2007 Einführung 03 - Tag 03
Word 2007 Einführung 03 - Tag 03
 
Word 2007 Einführung 02 - Tag 02
Word 2007 Einführung 02 - Tag 02Word 2007 Einführung 02 - Tag 02
Word 2007 Einführung 02 - Tag 02
 
Word 2007 Einführung 01 - Tag 1
Word 2007 Einführung 01 - Tag 1Word 2007 Einführung 01 - Tag 1
Word 2007 Einführung 01 - Tag 1
 
Word 2007 Einführung 00 - Agenda
Word 2007 Einführung 00 - AgendaWord 2007 Einführung 00 - Agenda
Word 2007 Einführung 00 - Agenda
 
Productivity- and Self Management
Productivity- and Self ManagementProductivity- and Self Management
Productivity- and Self Management
 
Logging mit log4net
Logging mit log4netLogging mit log4net
Logging mit log4net
 
Einführung Team Foundation Server 2010
Einführung Team Foundation Server 2010Einführung Team Foundation Server 2010
Einführung Team Foundation Server 2010
 
AOP mit PostSharp
AOP mit PostSharpAOP mit PostSharp
AOP mit PostSharp
 
Varianten des "Observer Pattern"
Varianten des "Observer Pattern"Varianten des "Observer Pattern"
Varianten des "Observer Pattern"
 
10000 Schritte - Was steckt dahinter
10000 Schritte - Was steckt dahinter10000 Schritte - Was steckt dahinter
10000 Schritte - Was steckt dahinter
 

O/R Mapping Einführung

  • 1. O/R Mapper O/R Mapper anhand von NHibernate & Entity Framework Thomas Mentzel März 2010
  • 2. No. 2© Logica 2010. All rights reserved Object-relational impedance mismatch Mapping Session Abfragen Agenda
  • 4. No. 4© Logica 2010. All rights reserved • Struktur • Objekt enthält Daten und Verhalten • Relationales Modell enthält ausschließlich Tupel (Daten) • Identität • Objekt hat zustandsunabhängige Identität • Tupel enthalten Identität (Primärschlüssel) • Datenkapselung • Objekt schützt Daten vor Veränderung (Methoden/Setter) • Tupel können beliebig geändert werden (im relationalen Sinne) • Arbeitsweise • Objekte sind Netzwerke interagierender Objekte. Kapselung durch Verhalten • Relationale Datenbank arbeitet prozedural Object-relational impedance mismatch
  • 5. No. 5© Logica 2010. All rights reserved Lösungsansätze • Objektorientierte Datenbanken • Kein “Mapping” • Applikationsgebunden • NoSQL • Relationale Funktionen in Programmiersprache • “Rückwärtslösung” • Keine Objektorientierung • InterSystems Cachè • Objekt-Relationale Mapper
  • 6. No. 6© Logica 2010. All rights reserved Objekt-Relationale Mapper • Abbildung der Tabellen auf Klassen • Wer war zuerst? Die Henne oder das Ei? • “Datenbank generiert Klassen” (DB zentriert) oder • “Klassen generieren Datenbank” (OOD zentriert)
  • 8. No. 8© Logica 2010. All rights reserved • Klassen/Eigenschaften • Primärschlüssel/Zusammengesetzte Schlüssel • Vererbung • Löschweitergabe • Änderungsverfolgung Herausforderungen
  • 9. No. 9© Logica 2010. All rights reserved • XML (NHibernate, EntityFramework) bzw. • Proprietäre Konfiguration • Attribute (NDO) • Code (FluentNHibernate) Konfiguration
  • 10. No. 10© Logica 2010. All rights reserved • Klasse  Tabelle • Eigenschaft  Spalten • Objektreferenz  Klasse/Tabelle • Listen  Klasse/Tabelle • Komplexe Typen  Tabelle oder Spalten? • Properties und Spalten nicht namensgleich • Klassen und Tabellen nicht namensgleich • Eine Klasse auf zwei Tabellen (Join) Klassen und Eigenschaften
  • 11. No. 11© Logica 2010. All rights reserved • Objektidentität != Primärschlüssel • Primärschlüssel Strategien • int, auto int, GUID, fachlicher Schlüssel • Composite Keys • GetHashCode() & Equals() • Fremdschlüsselverweise • Eineindeutiges Objekt *-Schlüssel
  • 12. No. 12© Logica 2010. All rights reserved NHibernate: Klassen-Mapping
  • 13. No. 13© Logica 2010. All rights reserved • Tabelle pro Vererbungshierarchie (Single Table) • Vorteile: ID-Contraints • Nachteile: Leere Spalten • Tabelle pro Unterklasse (Joined) • Vorteile: Tabellen bilden „Vererbungsstruktur“ ab • Nachteile: Abstrakte Basisklasse „instanziierbar“, ID-Constraints beschränkt • Tabelle pro konkrete Klasse (Table per Class) • Vorteile: Keine „instanziierbare“ abstrakte Basisklasse • Nachteile: Spalten der Basisklasse in allen Tabellen, keine ID-Constraints Vererbung
  • 14. No. 14© Logica 2010. All rights reserved • Cascade Optionen • <Bag … Cascade=„all-delete-orhpans“> none, save-update, delete, delete-orphan, all, all-delete-orphan (NHibernate) • <OnDelete Action="Cascade" /> (EntityFramework; SSDL & CSDL) • Zirkuläre Referenzen • Löschen von „Lookup“-Werten • Wann ist ein Objekt ein „Orphan“ (Waise) Löschweitergabe
  • 15. No. 15© Logica 2010. All rights reserved • Eigenschaften-Setter überwachen • Klassen können den Status intern ändern (Fields) • Unterschiedliche Strategien • Eigenschaften mit INotifyPropertyChanged (EntityFramework) • Dynamische Proxys (NHibernate) • PostCompiler und Code Injection (NDO) • POCO vs. ORM-Basisklasse • NHibernate benutzt „Plain-Old-CLR-Objects“ • EntityFramework benutzt eine Basisklasse Änderungsverfolgung
  • 16. No. 16© Logica 2010. All rights reserved EntityFramework: Generierte Klassen
  • 18. No. 18© Logica 2010. All rights reserved • EntityFramework • new Context(); // aka. Session • NHibernate • new Configuration().AddAssembly(); • new SessionFactory(); // ThreadSafe • Session = SessionFactory.CreateSession(); // Non-ThreadSafe „Session“
  • 19. No. 19© Logica 2010. All rights reserved • Identity Map [Fowler, P of EAA 195] • IdentityMap per Session • Jede Session liest Daten aus der Datenbank • Context1.Person(id=1) != Context2.Person(id=1) Caching der Objekte
  • 20. No. 20© Logica 2010. All rights reserved • Pro Aktion eine neue Session erstellen • Singleton Session Implementierungen
  • 21. No. 21© Logica 2010. All rights reserved • Lazy Loading • Deferred Loading • Eager Loading • Design-Pattern zum Nachladen • Lazy Initialization (Initialisieren bei Zugriff –“Singleton“) • Virtual Proxy (Schnittstellen Dummy) • Value Holder (Wrapper) • Ghost (Partial Initialized) • NHibernate: Lazy Loading/Eager Loading • EntityFramework: Deferred Loading • if (!Parent.Children.Loaded) Parent.Children.Load() • Context.Parents.Include(„Children“) *-Loading
  • 23. No. 23© Logica 2010. All rights reserved • Natives SQL • IQuery sqlQuery = Session.CreateSQLQuery(someComplexQuery); • IList<Person> people = sqlQuery.List<Person>(); • Proprietäre OO Abfragesprachen • HQL (NHibernate) • var query = „from Cat where Name=‚fritz„“; • LINQ • seit .NET 3.0 • SQL ähnlicher Syntax • Linq2Objects • Linq2SQL (Microsoft) • Linq2EF (Microsoft) • Linq2Hibernate (OpenSource) • Eigene Ling-Provider Abfragesprachen
  • 24. No. 24© Logica 2010. All rights reserved LINQ Magie • Delayed Execution • Abfrage erzeugt ExpressionTree • Jedes (!) .ToList() führt eine Datenbankabfrage aus (Linq2EF) • query.Where().OrderBy().ToList() wird in SQL umgewandelt • query.ToList().Where().OrderBy() wird auf dem Objektmodell ausgeführt • Delayed Execution benötigt einen Context
  • 25. No. 25© Logica 2010. All rights reserved • Warum führt jede „Abfrage“ auch ein SQL aus? Die Session kennt doch die Daten! Häufige Fragen
  • 26. Fragen? Thomas Mentzel Email: thomas.mentzel@logica.com MSN: thomas.mentzel@logica.com Twitter: http://twitter.com/ThomasMentzel Blog: http://thomas.mentzel.name