.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