Mapping - NET User Group Bern

Werbung
.NET
User
Group
Bern
René Leupold
Patrick Weibel
www.dnug-bern.ch
Follow dnugbe on twitter
DNUG Bern Sponsoren
Über René Leupold
• [email protected]
• http://www.databinding.net
• CV siehe Xing ;-)
Über Patrick Weibel
•
•
•
•
[email protected]
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 Code-First
Teamfähig
(CTP 4)
Unterstützte Vorgehensweisen
Vorgehen
Top down
Code First (CTP4)
Middle out
Model First (EF 4)
Bottom up
Generate from Database
(EF 1)
Leave the company
Meet in the middle
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
Meet in the middle
db2hbm, hbm2net
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 FKAssocations (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
NHibernate
• Nur wenn PK aus FK
besteht
• Bei zusätzlichen
Informationen PK
anlegen und auf n : m
verzichten
• XML-Mapping
– many-to-many
• Fluent-Mapping
– HasManyToMany
• Inverse nicht vergessen!
• Cascade „all-deleteorphan“ 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
NHibernate
• Default Parent und Child
Navigation Property
• XML-Mapping
– Analog zu 1 : m Mapping
• Fluent-Mapping
– Analog zu 1 : m Mapping
• Cascade „all-deleteorphan“ sinnvoll bei
Collection
1 Klasse : m Tabellen
Entity Framework
NHibernate
• Tabellen müssen 1 : 1 –
Beziehung besitzen
• Konfiguration über die
Mappings
• XML-Mapping
– Tabelle hinzufügen
– join
• Fluent-Mapping
– Join
m Klassen : 1 Tabelle
Entity Framework
NHibernate
• Complex Type
• Auslagern von Properties,
wenn Support für LazyLoading
• XML-Mapping
– component
• Fluent-Mapping
– Component
– ComponentMap Klasse
• XML: Redundanz
• Attribute-Mapping
– Workaround mit [RawXml]
TPH
Entity Framework
NHibernate
• Entities anlegen
• Vererbungshierarchy
anlegen
• Discriminator definieren
• XML-Mapping
– discriminator
– subclass mit discriminatorvalue
• Fluent-Mapping
– Root-Klasse mit ClassMap
und
DiscriminateSubClassesOnColumn
– SubclassMap und
DiscriminatorValue
TPT
Entity Framework
NHibernate
• Anpassungen der
Beziehungen
• ID-Spalten Book, Ebook
und Hardcover entfernen
• 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
Herunterladen