Download de presentatie
De presentatie wordt gedownload. Even geduld aub
1
NHibernate in DeltaShell
2
Wat is NHibernate? Object-Relational Mapper
Database /tabel(len)/ rijen Geheugen / Class/ .Net CLR object
3
Waarom NHibernate? Abstractie boven de DB (db-agnostisch)
Minder onderhoud dan sql queries Rijk, ‘oud’ port van Java Hibernate Lazy loading, dirty checking etc Schema-export /update
4
Configuratie: via app.config
<configSections> <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler,NHibernate"/> </configSections> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> <session-factory> <property name="connection.provider"> NHibernate.Connection.DriverConnectionProvider </property> <property name="dialect"> NHibernate.Dialect.MsSql2005Dialect <property name="connection.driver_class"> NHibernate.Driver.SqlClientDriver <!-- local --> <property name="connection.connection_string"> Server=xp;initial catalog=DataManagerTest;Integrated Security=SSPI <property name='proxyfactory.factory_class'> NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu </session-factory> </hibernate-configuration>
5
Configuratie : in code (runtime)
(Her)Configureren via properties Toevoegen mappings (AddAssemblie) Bepalen naming-strategies Toevoegen DataAccessListeners
6
NHibernate entititeiten
Session Load() Save() Transactions Configuration Mappings Connection String Settings SessionFactory OpenSession
7
Voorbeeld: VM opslaan en app.config
8
Nhibernate object states
9
Configuratie : mapping files
1 hbm.xml file per class Voeg NHibernate.xsd’s toe aan VS Embedded resource!! Zeg zo weinig mogelijk in je mappings Surrogaat key ID
10
Voorbeeld mapping : Profile
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="IETObjects" assembly="IETObjects"> <class name="Profile" lazy="false" > <id name="DatabaseID" unsaved-value="0" column="ID" type="integer" > <generator class="native"/> </id> <property name="Url" /> <property name="Name" /> <property name="Language" /> <property name="LoginOnce" /> <list name="Screens" cascade="all-delete-orphan" lazy="false" > <key column="profile_id"/> <index column="screen_profile_index" /> <one-to-many class="IETObjects.Screens.Screen" /> </list> <many-to-one class="Administrator" name="Administrator" /> </class> </hibernate-mapping>
11
Verschillende relaties
One-to-many (Map.Layers) Foreign key in child-table Mapping : In Set,List Bag mapping van parent Many-to-one (CoverageLayer.Coverage) Mapping : in childmapping
12
Verschillende relaties 2
Many-to-many (Variable->Arguments) In aparte koppel tabel Mapping : in Collectie element (List,Set bag etc) One-to-One Relatie tussen primary keys Mapping: in Parent (Person.Address) Not recommended (lazy etc)
13
One-to-many Parent / Child Map / Layer Mapping in collectie in parent:
14
One-to-many : tabellen
15
Many-to-one Mapping in child
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> <class name="IETObjects.Answer, IETObjects" > <id name="DatabaseID" unsaved-value="0" column="ID" type="integer" > <generator class="native"/> </id> <property name="TotalAnswer" /> <many-to-one name="Case" column="caseID" not-null="true" /> <many-to-one name="User“ column="userid" not-null="true"/> </class> </hibernate-mapping>
16
Many-to-one : tabellen
17
Many-to-many Mapping aan een of beide kanten
<class name=“Artist" > <id name="Id" column="id" type="System.Int64" unsaved-value="0"> <generator class="increment" /> </id> <list name=“Concerts" table=“artist_concerts" > <key column=“artist_id"/> <index column=“artist_list_idx" /> <many-to-many class=“Concert" column=“concert_id" /> </list> </class>
18
Many-to-many : tabellen
19
Any-type mappings Foreign key naar willekeurige tabel
Mapping in ‘parent’ (a la many-to-one) <class name="Order" table="Orders"> <id name="Id"> <generator class="native"/> </id> <any name="Payment" id-type="System.Int64" meta-type="System.String" cascade="all"> <meta-value value="CreditCard" class="CreditCardPayment"/> <meta-value value="Wire" class="WirePayment"/> <column name="PaymentType"/> <column name="PaymentId"/> </any> </class>
20
Any-type : tabellen Geen ‘echte’ foreign keys
Restrictie in primary key type van gemapped classes Uitzonderings situatie, vaak is er een betere oplossing
21
Inheritance Table-per-classhierarchy Table-per-subclass
Table-per-concrete-class
22
Inheritance: table-per-classhierarchy
Alle entiteiten in 1 tabel Subclass met discriminator Discriminator column voor types Goede performance Sparse tabel Ongewilde relaties tussen subclasses (column types)
23
Inheritance: table per concrete class
Geen associaties op base class niveau Union-subclass Niet genormaliseerd Zelfde property in veel tabellen
24
Inheritance : table-per-subclass
Meest OO (weinig redundantie) Geen wijziging base-class tabellen Lage performance Join(s) voor enkele entiteit
25
Inheritance :kiezen Table-per-classhierarchy Table-per-subclass
Simpel : 1st keus Table-per-subclass Als optie 1 te groot of als er een duidelijke scheiding in het schema moet komen Table-per-concrete-class
26
Acces-strategies Property : default map naar public property
Field: map naar field. Geef fieldnaam op in mapping (als geen naming strategie) NoSetter: als field maar gebruikt property voor Get (Readonly) Custom (eigen class)
27
Naming-strategies Hoe kom ik van een public property naar het bijbehorende field? Camelcase Camelcase_ Lowercase …
28
Acces strategy <joined-subclass name="DataItemSet" >
<key column="folder_item_id"/> <property name="Tag" access="nosetter.camelcase" /> <!--ensures a list is created on load--> <!--<property access="field" name="isSynchronizedWithList"/>--> <!--type of the list to create EventedList<T> --> <!--<property access="field" name="listType" />--> <property name="itemType" access="field" /> /joined-subclass > </joined-subclass>
29
Cascade object relaties
Eigenaar van object? Zet een cascade op. Object relaties :many-to-one,one-to-many,many-to-many Opties All :save-update-delete van relatie Save-Update : geen delete All-delete-orphan: all+als een object uit alle collecties delete het (orphan) None: object zorgt voor zichzelf
30
Lazy classes Default is lazy!
Alle public accessors (methods properties) moeten virtueel. Proxy objecten Open session is nodig (onhandig voor web)
31
Usertypes Alleen als niet als anders kan
Custom opslag van en naar byte[] Geen foreign keys Geen updates Voorbeeld : GeometryUserType
32
DeltaShell: Database structuur
Project is root Zorg voor juiste ‘cascade’ regels zodat je object opgeslagen wordt.
33
DataItem Value Types Any type mapping: foreign key naar meerdere tabellen Zorg er voor dat je object wordt teruggeven door een DataProvider.SupportedDataObjectNames
34
DataAccessListeners Herschijft bestands namen Reconnect bij save-as
Run code bij bepaalde database acties (pre-insert, post-load etc) Nu alleen FileBased DAL. Herschijft bestands namen Reconnect bij save-as public bool OnPreInsert(object entity, object[] state, string[] propertyNames) { if (entity is IFileBased) MakePathRelative(entity as IFileBased, state, propertyNames); } return false;//no veto
35
Mappen van Modellen Voeg modeldata toe in DataItems
Map de modeldata data classes Zorg ervoor dat deze classes in de any-type van DataItem terecht komen via dataProviders. OF : maak custom mappings
36
NHibernate binnen test
NHibernate configuratie is static Voeg zelf assemblies toe met NHibernateProjectRepository.RegisterAssembly() Voeg DataItem ValueType mappings toe met NHibernateProjectRepository.RegisterDataItemValueType Reset static configuratie met NHibernateProjectRepository.ResetConfiguration()
37
Veel voorkomende fouten
Key not found exception -> DataItemType Event registratie en Nhibernate Nhibernate set properties dus unsubscribe/subscribe daar. Unmapped class Geen embedded resource?
38
Nhibernate Profiler Demo in VM. Download trial van Ayende
39
NHibernate Linq IQueryable SQL Demo2 in VM
40
Nog meer!!? NHibernate in Action van manning Ayende’s blog
ActiveRecord Fluent-Nhibernate
Verwante presentaties
© 2024 SlidePlayer.nl Inc.
All rights reserved.