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 auss...
No. 5© Logica 2010. All rights reserved
Lösungsansätze
• Objektorientierte Datenbanken
• Kein “Mapping”
• Applikationsgebu...
No. 6© Logica 2010. All rights reserved
Objekt-Relationale Mapper
• Abbildung der Tabellen auf Klassen
• Wer war zuerst? D...
Mapping
No. 8© Logica 2010. All rights reserved
• Klassen/Eigenschaften
• Primärschlüssel/Zusammengesetzte Schlüssel
• Vererbung
•...
No. 9© Logica 2010. All rights reserved
• XML (NHibernate, EntityFramework) bzw.
• Proprietäre Konfiguration
• Attribute (...
No. 10© Logica 2010. All rights reserved
• Klasse  Tabelle
• Eigenschaft  Spalten
• Objektreferenz  Klasse/Tabelle
• Li...
No. 11© Logica 2010. All rights reserved
• Objektidentität != Primärschlüssel
• Primärschlüssel Strategien
• int, auto int...
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
• Nac...
No. 14© Logica 2010. All rights reserved
• Cascade Optionen
• <Bag … Cascade=„all-delete-orhpans“>
none, save-update, dele...
No. 15© Logica 2010. All rights reserved
• Eigenschaften-Setter überwachen
• Klassen können den Status intern ändern (Fiel...
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 Configurati...
No. 19© Logica 2010. All rights reserved
• Identity Map [Fowler, P of EAA 195]
• IdentityMap per Session
• Jede Session li...
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
...
Abfragen
No. 23© Logica 2010. All rights reserved
• Natives SQL
• IQuery sqlQuery = Session.CreateSQLQuery(someComplexQuery);
• ILi...
No. 24© Logica 2010. All rights reserved
LINQ Magie
• Delayed Execution
• Abfrage erzeugt ExpressionTree
• Jedes (!) .ToLi...
No. 25© Logica 2010. All rights reserved
• Warum führt jede „Abfrage“ auch ein SQL aus?
Die Session kennt doch die Daten!
...
Fragen?
Thomas Mentzel
Email: thomas.mentzel@logica.com
MSN: thomas.mentzel@logica.com
Twitter: http://twitter.com/ThomasM...
Vielen Dank
Thomas Mentzel
Nächste SlideShare
Wird geladen in …5
×

O/R Mapping Einführung

298 Aufrufe

Veröffentlicht am

Einführung in O/R Mapping und die Konzepte

Veröffentlicht in: Technologie
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
298
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
5
Aktionen
Geteilt
0
Downloads
0
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

O/R Mapping Einführung

  1. 1. O/R Mapper O/R Mapper anhand von NHibernate & Entity Framework Thomas Mentzel März 2010
  2. 2. No. 2© Logica 2010. All rights reserved Object-relational impedance mismatch Mapping Session Abfragen Agenda
  3. 3. Object-relational impedance mismatch
  4. 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. 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. 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)
  7. 7. Mapping
  8. 8. No. 8© Logica 2010. All rights reserved • Klassen/Eigenschaften • Primärschlüssel/Zusammengesetzte Schlüssel • Vererbung • Löschweitergabe • Änderungsverfolgung Herausforderungen
  9. 9. No. 9© Logica 2010. All rights reserved • XML (NHibernate, EntityFramework) bzw. • Proprietäre Konfiguration • Attribute (NDO) • Code (FluentNHibernate) Konfiguration
  10. 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. 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. 12. No. 12© Logica 2010. All rights reserved NHibernate: Klassen-Mapping
  13. 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. 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. 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. 16. No. 16© Logica 2010. All rights reserved EntityFramework: Generierte Klassen
  17. 17. Session
  18. 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. 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. 20. No. 20© Logica 2010. All rights reserved • Pro Aktion eine neue Session erstellen • Singleton Session Implementierungen
  21. 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
  22. 22. Abfragen
  23. 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. 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. 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. 26. Fragen? Thomas Mentzel Email: thomas.mentzel@logica.com MSN: thomas.mentzel@logica.com Twitter: http://twitter.com/ThomasMentzel Blog: http://thomas.mentzel.name
  27. 27. Vielen Dank Thomas Mentzel

×