SlideShare ist ein Scribd-Unternehmen logo
1 von 45
Downloaden Sie, um offline zu lesen
.NET
User
Group
Bern
René Leupold
Patrick Weibel
www.dnug-bern.ch
Follow dnugbe on twitter
DNUG Bern Sponsoren
Über René Leupold
• connect@databinding.net
• http://www.databinding.net
• CV siehe Xing ;-)
Über Patrick Weibel
• network@eweibel.net
• http://blog.eweibel.net
• twitter.com/pweibel
• CV siehe Xing
Vorbereitung reicht für mehr
Agenda
• Überblick
• Vorgehen
• Einführung Entity Framework
• Einführung NHibernate
• Mapping
• Ausblick
ORM EF/NH
Überblick
• ORM impedance mismatch
• Vererbung
• Relationen und Beziehungen
• Persistence ingnorance
• ORM als Silver Bullet
ORM Theorie
ORM impedance mismatch
• Identität
• Struktur
• Kapselung
• Vererbung & Polymorphismus
• Relationen/Beziehungen
Vererbung: Table per hierarchie
(TPH)
• Synonym
– Single table inheritance
Vererbung: Table per type (TPT)
• Synonym
– class table inheritance (Vertikale
Partitionierung)
Vererbung: Table per class (TPC)
• Synonym
– Table per concrete class
– concrete table inheritance (Horizontale Partitionierung)
Relationen und Beziehungen
Persistence ignorance
• Entität ist Persistenz egal
• Plain Old CLR Objects (POCO)
• Keine Referenz zum Persistenzlayer
• Mögliche Verletzung bei:
– Id, Versionsfeld
– Basisklasse oder Interfaces
– Attribute
– Virtuelle Eigenschaften
ORM als Silver Bullet?
• „Brauche kein SQL zu beherrschen“
• „Relationale Modell hat kein Einfluss auf
OO-Design“
• „Batch Processing“
Vorgehen
• Top down
• Middle out
• Bottom up
• Meet in the middle
Top Down
• Synonyme
– Forward Engineering
– Code First
• Klassen zuerst
• Code-Generierung
– Mapping
– DB-Schema
Middle out
• Synonyme
– Model First
• Mapping zuerst
• Code-Generierung
– Klassen
– DB-Schema
Bottom up
• Synonyme
– Reverse Engineering
• DB-Schema zuerst
• Code-Generierung
– Mapping
– Klassen
Meet in the middle
• Synonyme
– n/a
• DB-Schema und Klassen zuerst
• Code-Generierung
– Mapping
• Mögliche Ursache
– Sturheit von Architekt und DBA
Einführung Entity Framework
• Geschichte
• Unterstützte Vorgehensweisen
• Konfiguration
• Hello World
EF Überblick
EF Geschichte VS 2008
Grenzen
abstecken
EF Geschichte VS 2008 SP1
hat nicht funktioniert1
EF Geschichte 2 Seiten
RAD
Client/Server
EF Geschichte 2 Seiten
EA
Web/SOA
EF Geschichte
Vote of no confidence
Hauptpunkte EF 4
Zu Datenorientiert, Fehlende OO-Ansätze TPT, TPC, TPH
unidirektional
Viel Code für Lazy Loading Eager-Loading
Explizites Lazy Loading
zwingt zum Nachdenken
Spezifische Datenmodelle und Best
Practices ermöglichen
T4
Fehlende Persistence Ignorance POCO
EDMX Merge Conflicts Source Cotrol, nicht
Teamfähig
Code-First
(CTP 4)
Unterstützte Vorgehensweisen
Vorgehen
Top down Code First (CTP4)
Middle out Model First (EF 4)
Bottom up Generate from Database
(EF 1)
Meet in the middle Leave the company
Konfiguration und Hello World
• Demo
Einführung NHibernate
• Geschichte
• Unterstützte Vorgehensweisen
• Konfiguration
• Hello World
NH Überblick
NH Geschichte
Fotograf: Andrew Cooper
NH Optionen
Unterstützte Vorgehensweisen
Vorgehen
Top down Codegenerator, hbm2ddl
Middle out hbm2net, hbm2ddl
Bottom up db2hbm, hbm2net
Meet in the middle Runaway
Konfiguration und Hello World
• Demo
Mapping
• 1 : m (Uni-/Bidirektional)
• m : n
• 1 : 1
• Selbstreferenzierung
• 1 Klasse auf mehrere Tabellen
• Mehrere Klassen auf eine Tabelle
• Vererbung: TPH, TPT, TPC
1 : m
Entity Framework
• Standard ist bidirektional
• Unidirektionale
Beziehung nur mit FK-
Assocations (EF 4)
• Workaround bei
Independent Associations
– Navigation Property
private
• Besonderheit
– Elemente aus Collection müssen
explizit gelöscht werden
NHibernate
• Standard ist
unidirektional
• XML-Mapping
– many-to-one
– one-to-many
• Fluent-Mapping
– References
– HasMany
• Inverse nicht vergessen!
n : m
Entity Framework
• Nur wenn PK aus FK
besteht
• Bei zusätzlichen
Informationen PK
anlegen und auf n : m
verzichten
NHibernate
• XML-Mapping
– many-to-many
• Fluent-Mapping
– HasManyToMany
• Inverse nicht vergessen!
• Cascade „all-delete-
orphan“ macht nicht viel
Sinn
1 : 1
Entity Framework
• Tabellen 1 : 1
– Keine Einschränkung
• Tabellen 1 : m mit UX
– Independent Association
funktioniert
– FK Association Workaround
notwendig
NHibernate
• XML-Mapping
– one-to-one
– many-to-one (bei
separatem FKey)
• Fluent-Mapping
– HasOne
– References (bei separatem
FKey)
• ID-Generator für
Erweiterungstabelle
„foreign“
Selbstreferenzierung
Entity Framework
• Default Parent und Child
Navigation Property
NHibernate
• XML-Mapping
– Analog zu 1 : m Mapping
• Fluent-Mapping
– Analog zu 1 : m Mapping
• Cascade „all-delete-
orphan“ sinnvoll bei
Collection
1 Klasse : m Tabellen
Entity Framework
• Tabellen müssen 1 : 1 –
Beziehung besitzen
• Konfiguration über die
Mappings
– Tabelle hinzufügen
NHibernate
• XML-Mapping
– join
• Fluent-Mapping
– Join
m Klassen : 1 Tabelle
Entity Framework
• Complex Type
• Auslagern von Properties,
wenn Support für Lazy-
Loading
NHibernate
• XML-Mapping
– component
• Fluent-Mapping
– Component
– ComponentMap Klasse
• XML: Redundanz
• Attribute-Mapping
– Workaround mit [RawXml]
TPH
Entity Framework
• Entities anlegen
• Vererbungshierarchy
anlegen
• Discriminator definieren
NHibernate
• XML-Mapping
– discriminator
– subclass mit discriminator-
value
• Fluent-Mapping
– Root-Klasse mit ClassMap
und
DiscriminateSubClassesOnColumn
– SubclassMap und
DiscriminatorValue
TPT
Entity Framework
• Anpassungen der
Beziehungen
• ID-Spalten Book, Ebook
und Hardcover entfernen
NHibernate
• XML-Mapping
– joined-subclass
• Fluent-Mapping
– Root-Klasse mit ClassMap
– Child-Klassen mit
SubclassMap
TPC
Entity Framework
• Anpassungen im XML
notwendig, nachdem die
Hierarchy definiert
wurde
• ID der Tabelle GUID,
damit die Datensätze
innerhalb der Datenbank
eindeutig sind
NHibernate
• XML-Mapping
– Variante 1
• Jede konkrete Klasse als
normale Entität
behandeln
– Variante 2
• union-subclass
• Fluent-Mapping
– Nicht explizit unterstützt
• Attribute-Mapping
– Habe (noch) keine schöne
Lösung gefunden
Uff
Fragen und Diskussion
Ausblick
• Abfragen
• Lazy und Eager Loading
• Debugging/Profiling
• Optimierung
• Concurrency
• Auditing
• Validierung
• Caching
• dnug be Screencast tv

Weitere ähnliche Inhalte

Mehr von NETUserGroupBern

Securing .NET Core, ASP.NET Core applications
Securing .NET Core, ASP.NET Core applicationsSecuring .NET Core, ASP.NET Core applications
Securing .NET Core, ASP.NET Core applicationsNETUserGroupBern
 
Application Security in ASP.NET Core
Application Security in ASP.NET CoreApplication Security in ASP.NET Core
Application Security in ASP.NET CoreNETUserGroupBern
 
What Doctors Can Teach Us on Continuous Learning
What Doctors Can Teach Us on Continuous LearningWhat Doctors Can Teach Us on Continuous Learning
What Doctors Can Teach Us on Continuous LearningNETUserGroupBern
 
Entity Framework Core - Der Umstieg auf Core
Entity Framework Core - Der Umstieg auf CoreEntity Framework Core - Der Umstieg auf Core
Entity Framework Core - Der Umstieg auf CoreNETUserGroupBern
 
Weiches Zeugs für harte Jungs und Mädels
Weiches Zeugs für harte Jungs und MädelsWeiches Zeugs für harte Jungs und Mädels
Weiches Zeugs für harte Jungs und MädelsNETUserGroupBern
 
Änderungen im Cardinality Estimator SQL Server 2014
Änderungen im Cardinality Estimator SQL Server 2014Änderungen im Cardinality Estimator SQL Server 2014
Änderungen im Cardinality Estimator SQL Server 2014NETUserGroupBern
 
Refactoring: Mythen & Fakten
Refactoring: Mythen & FaktenRefactoring: Mythen & Fakten
Refactoring: Mythen & FaktenNETUserGroupBern
 
Pragmatische Anforderungen
Pragmatische AnforderungenPragmatische Anforderungen
Pragmatische AnforderungenNETUserGroupBern
 
What the hell is PowerShell?
What the hell is PowerShell?What the hell is PowerShell?
What the hell is PowerShell?NETUserGroupBern
 
BDD mit Machine.Specifications (MSpec)
BDD mit Machine.Specifications (MSpec)BDD mit Machine.Specifications (MSpec)
BDD mit Machine.Specifications (MSpec)NETUserGroupBern
 
.NETworking Workshop Design Thinking
.NETworking Workshop Design Thinking.NETworking Workshop Design Thinking
.NETworking Workshop Design ThinkingNETUserGroupBern
 
Reaktive Programmierung mit den Reactive Extensions (Rx)
Reaktive Programmierung mit den Reactive Extensions (Rx)Reaktive Programmierung mit den Reactive Extensions (Rx)
Reaktive Programmierung mit den Reactive Extensions (Rx)NETUserGroupBern
 

Mehr von NETUserGroupBern (20)

AAD und .NET
AAD und .NETAAD und .NET
AAD und .NET
 
SHIFT LEFT WITH DEVSECOPS
SHIFT LEFT WITH DEVSECOPSSHIFT LEFT WITH DEVSECOPS
SHIFT LEFT WITH DEVSECOPS
 
Securing .NET Core, ASP.NET Core applications
Securing .NET Core, ASP.NET Core applicationsSecuring .NET Core, ASP.NET Core applications
Securing .NET Core, ASP.NET Core applications
 
Application Security in ASP.NET Core
Application Security in ASP.NET CoreApplication Security in ASP.NET Core
Application Security in ASP.NET Core
 
Einführung in RavenDB
Einführung in RavenDBEinführung in RavenDB
Einführung in RavenDB
 
What Doctors Can Teach Us on Continuous Learning
What Doctors Can Teach Us on Continuous LearningWhat Doctors Can Teach Us on Continuous Learning
What Doctors Can Teach Us on Continuous Learning
 
Entity Framework Core - Der Umstieg auf Core
Entity Framework Core - Der Umstieg auf CoreEntity Framework Core - Der Umstieg auf Core
Entity Framework Core - Der Umstieg auf Core
 
Weiches Zeugs für harte Jungs und Mädels
Weiches Zeugs für harte Jungs und MädelsWeiches Zeugs für harte Jungs und Mädels
Weiches Zeugs für harte Jungs und Mädels
 
Änderungen im Cardinality Estimator SQL Server 2014
Änderungen im Cardinality Estimator SQL Server 2014Änderungen im Cardinality Estimator SQL Server 2014
Änderungen im Cardinality Estimator SQL Server 2014
 
Rest Fundamentals
Rest FundamentalsRest Fundamentals
Rest Fundamentals
 
Refactoring: Mythen & Fakten
Refactoring: Mythen & FaktenRefactoring: Mythen & Fakten
Refactoring: Mythen & Fakten
 
AngularJs
AngularJsAngularJs
AngularJs
 
Pragmatische Anforderungen
Pragmatische AnforderungenPragmatische Anforderungen
Pragmatische Anforderungen
 
Einführung in MongoDB
Einführung in MongoDBEinführung in MongoDB
Einführung in MongoDB
 
What the hell is PowerShell?
What the hell is PowerShell?What the hell is PowerShell?
What the hell is PowerShell?
 
Know your warm up
Know your warm upKnow your warm up
Know your warm up
 
BDD mit Machine.Specifications (MSpec)
BDD mit Machine.Specifications (MSpec)BDD mit Machine.Specifications (MSpec)
BDD mit Machine.Specifications (MSpec)
 
Versionskontrolle mit Git
Versionskontrolle mit GitVersionskontrolle mit Git
Versionskontrolle mit Git
 
.NETworking Workshop Design Thinking
.NETworking Workshop Design Thinking.NETworking Workshop Design Thinking
.NETworking Workshop Design Thinking
 
Reaktive Programmierung mit den Reactive Extensions (Rx)
Reaktive Programmierung mit den Reactive Extensions (Rx)Reaktive Programmierung mit den Reactive Extensions (Rx)
Reaktive Programmierung mit den Reactive Extensions (Rx)
 

O/R-Mapping mit NHibernate und Entity Framework

  • 3. Über René Leupold • connect@databinding.net • http://www.databinding.net • CV siehe Xing ;-)
  • 4. Über Patrick Weibel • network@eweibel.net • http://blog.eweibel.net • twitter.com/pweibel • CV siehe Xing
  • 6. Agenda • Überblick • Vorgehen • Einführung Entity Framework • Einführung NHibernate • Mapping • Ausblick ORM EF/NH
  • 7. Überblick • ORM impedance mismatch • Vererbung • Relationen und Beziehungen • Persistence ingnorance • ORM als Silver Bullet ORM Theorie
  • 8. ORM impedance mismatch • Identität • Struktur • Kapselung • Vererbung & Polymorphismus • Relationen/Beziehungen
  • 9. Vererbung: Table per hierarchie (TPH) • Synonym – Single table inheritance
  • 10. Vererbung: Table per type (TPT) • Synonym – class table inheritance (Vertikale Partitionierung)
  • 11. Vererbung: Table per class (TPC) • Synonym – Table per concrete class – concrete table inheritance (Horizontale Partitionierung)
  • 13. Persistence ignorance • Entität ist Persistenz egal • Plain Old CLR Objects (POCO) • Keine Referenz zum Persistenzlayer • Mögliche Verletzung bei: – Id, Versionsfeld – Basisklasse oder Interfaces – Attribute – Virtuelle Eigenschaften
  • 14. ORM als Silver Bullet? • „Brauche kein SQL zu beherrschen“ • „Relationale Modell hat kein Einfluss auf OO-Design“ • „Batch Processing“
  • 15. Vorgehen • Top down • Middle out • Bottom up • Meet in the middle
  • 16. Top Down • Synonyme – Forward Engineering – Code First • Klassen zuerst • Code-Generierung – Mapping – DB-Schema
  • 17. Middle out • Synonyme – Model First • Mapping zuerst • Code-Generierung – Klassen – DB-Schema
  • 18. Bottom up • Synonyme – Reverse Engineering • DB-Schema zuerst • Code-Generierung – Mapping – Klassen
  • 19. Meet in the middle • Synonyme – n/a • DB-Schema und Klassen zuerst • Code-Generierung – Mapping • Mögliche Ursache – Sturheit von Architekt und DBA
  • 20. Einführung Entity Framework • Geschichte • Unterstützte Vorgehensweisen • Konfiguration • Hello World EF Überblick
  • 21. EF Geschichte VS 2008 Grenzen abstecken
  • 22. EF Geschichte VS 2008 SP1 hat nicht funktioniert1
  • 23. EF Geschichte 2 Seiten RAD Client/Server
  • 24. EF Geschichte 2 Seiten EA Web/SOA
  • 25. EF Geschichte Vote of no confidence Hauptpunkte EF 4 Zu Datenorientiert, Fehlende OO-Ansätze TPT, TPC, TPH unidirektional Viel Code für Lazy Loading Eager-Loading Explizites Lazy Loading zwingt zum Nachdenken Spezifische Datenmodelle und Best Practices ermöglichen T4 Fehlende Persistence Ignorance POCO EDMX Merge Conflicts Source Cotrol, nicht Teamfähig Code-First (CTP 4)
  • 26. Unterstützte Vorgehensweisen Vorgehen Top down Code First (CTP4) Middle out Model First (EF 4) Bottom up Generate from Database (EF 1) Meet in the middle Leave the company
  • 27. Konfiguration und Hello World • Demo
  • 28. Einführung NHibernate • Geschichte • Unterstützte Vorgehensweisen • Konfiguration • Hello World NH Überblick
  • 31. Unterstützte Vorgehensweisen Vorgehen Top down Codegenerator, hbm2ddl Middle out hbm2net, hbm2ddl Bottom up db2hbm, hbm2net Meet in the middle Runaway
  • 32. Konfiguration und Hello World • Demo
  • 33. Mapping • 1 : m (Uni-/Bidirektional) • m : n • 1 : 1 • Selbstreferenzierung • 1 Klasse auf mehrere Tabellen • Mehrere Klassen auf eine Tabelle • Vererbung: TPH, TPT, TPC
  • 34. 1 : m Entity Framework • Standard ist bidirektional • Unidirektionale Beziehung nur mit FK- Assocations (EF 4) • Workaround bei Independent Associations – Navigation Property private • Besonderheit – Elemente aus Collection müssen explizit gelöscht werden NHibernate • Standard ist unidirektional • XML-Mapping – many-to-one – one-to-many • Fluent-Mapping – References – HasMany • Inverse nicht vergessen!
  • 35. n : m Entity Framework • Nur wenn PK aus FK besteht • Bei zusätzlichen Informationen PK anlegen und auf n : m verzichten NHibernate • XML-Mapping – many-to-many • Fluent-Mapping – HasManyToMany • Inverse nicht vergessen! • Cascade „all-delete- orphan“ macht nicht viel Sinn
  • 36. 1 : 1 Entity Framework • Tabellen 1 : 1 – Keine Einschränkung • Tabellen 1 : m mit UX – Independent Association funktioniert – FK Association Workaround notwendig NHibernate • XML-Mapping – one-to-one – many-to-one (bei separatem FKey) • Fluent-Mapping – HasOne – References (bei separatem FKey) • ID-Generator für Erweiterungstabelle „foreign“
  • 37. Selbstreferenzierung Entity Framework • Default Parent und Child Navigation Property NHibernate • XML-Mapping – Analog zu 1 : m Mapping • Fluent-Mapping – Analog zu 1 : m Mapping • Cascade „all-delete- orphan“ sinnvoll bei Collection
  • 38. 1 Klasse : m Tabellen Entity Framework • Tabellen müssen 1 : 1 – Beziehung besitzen • Konfiguration über die Mappings – Tabelle hinzufügen NHibernate • XML-Mapping – join • Fluent-Mapping – Join
  • 39. m Klassen : 1 Tabelle Entity Framework • Complex Type • Auslagern von Properties, wenn Support für Lazy- Loading NHibernate • XML-Mapping – component • Fluent-Mapping – Component – ComponentMap Klasse • XML: Redundanz • Attribute-Mapping – Workaround mit [RawXml]
  • 40. TPH Entity Framework • Entities anlegen • Vererbungshierarchy anlegen • Discriminator definieren NHibernate • XML-Mapping – discriminator – subclass mit discriminator- value • Fluent-Mapping – Root-Klasse mit ClassMap und DiscriminateSubClassesOnColumn – SubclassMap und DiscriminatorValue
  • 41. TPT Entity Framework • Anpassungen der Beziehungen • ID-Spalten Book, Ebook und Hardcover entfernen NHibernate • XML-Mapping – joined-subclass • Fluent-Mapping – Root-Klasse mit ClassMap – Child-Klassen mit SubclassMap
  • 42. TPC Entity Framework • Anpassungen im XML notwendig, nachdem die Hierarchy definiert wurde • ID der Tabelle GUID, damit die Datensätze innerhalb der Datenbank eindeutig sind NHibernate • XML-Mapping – Variante 1 • Jede konkrete Klasse als normale Entität behandeln – Variante 2 • union-subclass • Fluent-Mapping – Nicht explizit unterstützt • Attribute-Mapping – Habe (noch) keine schöne Lösung gefunden
  • 43. Uff
  • 45. Ausblick • Abfragen • Lazy und Eager Loading • Debugging/Profiling • Optimierung • Concurrency • Auditing • Validierung • Caching • dnug be Screencast tv