NHibernate & Friends Lee Brandt
Nov 14, 2014
NHibernate & FriendsLee Brandt
Visual C#
Code Monkey
User Group Mentor (KS, MO)
@leebrandt
http://www.leebrandt.me
Killer• Killer• Killers
Weapons• IList<Weapon>• Weapons
Victims• IList<Victim>• Victims
Agenda• Nhibernate– Configuration– Mapping– Querying
• Fluent Nhibernate– Configuration– Mapping
• Linq2NHibernate– Querying
• One, Big, Happy F@mily
NHibernate• Object-Relational Mapper (ORM)• Map Objects in Code to Relational Data• Uses XML for Mappings & Configuration• Compiles XML with DLLs• It’s Still Like Pizza
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> <session-factory> <property name="connection.provider">
NHibernate.Connection.DriverConnectionProvider </property> <property name="connection.driver_class">
NHibernate.Driver.SqlClientDriver </property> <property name="connection.connection_string">
FullOnDatabaseConnectionStringLikeYouNormallyPutInTheWebConfig </property> <property name="dialect">
NHibernate.Dialect.MsSql2008Dialect </property> <property name="proxyfactory.factory_class">
NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle </property> </session-factory> </hibernate-configuration>
Configuration
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly=“MyApp" namespace=“MyApp.Domain"> <class name=“Killer" table=“Killers"> <id name=“KillerId"> <generator class="guid"/> </id> <property name=“Name"/> <property name=“Bio" type="StringClob"> <column name=“Biography" sql-type="ntext"/> </property> <set name=“Weapons” > <key column=“KillerId"/> <one-to-many class=“Weapon"/> </set> <set name=“Victims” > <key column=“KillerId "/> <one-to-many class=“Victim"/> </set> </class> </hibernate-mapping>
Mapping
Fluent NHibernate• Fluent Interfaces• Write Mappings & Configuration in Code• Automapping– Convention over configuration
• Added Beer
VB Dim sessionFactory = Fluently.Configure() _ .Database(MsSqlConfiguration.MsSql2008 _ .ConnectionString(GetYouConnectionStringFromWhereEver)) _ .Mappings(Function(m) m.FluentMappings.AddFromAssemblyOf(Of Product)()) _ .BuildSessionFactory()
C# var sessionFactory = Fluently.Configure() .Database(SQLiteConfiguration.Standard .ConnectionString(cs=>cs.FromConnectionStringWithKey("Default"))
.Mappings(m => m.AutoMappings.Add( AutoMap.AssemblyOf<Killer>(new AutoMappingConfig())
.BuildSessionFactory();
Configuration
Public Class ProductMap Inherits ClassMap(Of Product)
Public Sub New() Table(“People") Id(Function(m) m.PersonID).GeneratedBy.Assigned() Map(Function(m) m.Name) Map(Function(m) m.Bio).Column(“Biography”) _ .CustomType(“StringClob”) _ .CustomSqlType(“ntext”) HasManyToMany(Function(m) m.GetWeapons()) _ .Table(“KillerWeapons”) _ .ParentKeyColumn(“KillerId”) _ .ChildKeyColumn(“WeaponId”) HasMany(Function(m) m.GetVictims()) _ .Table(“Victims”) _ .KeyColumn(“KillerId”) End SubEnd Class
Mapping (Visual Basic)
public class KillerMap : ClassMap<Killer> { public KillerMap() { Table("Killers"); Schema("KillerApp"); Id(k => k.ID).GeneratedBy.Identity(); Map(p => p.Name).Column(“KillerName"); Map(p => p.RealName);
HasMany(p => p.Victims).Table("Victims").KeyColumn("Killer_Id"); HasMany(p => p.Weapons); } }
Mapping (C#)
LINQ 2 NHibernate• Problem with Querying in Nhibernate– Au Natural– HQL– ICriteria– LINQ to NHibernate
• Stay In Code• Test Queries Without Touching the Database• The Salad
Dim products = Session.CreateCriteria(Of Person).List(Of Person)()var products = Session.CreateCriteria<Person>().List<Person)();
Dim query = Session.CreateQuery(“From People”)Dim products As IList(Of Person) = query.List(Of Person)()
var query = Session.CreateQuery(“From People”);var products = query.List<Person>();
Dim products = Session.Linq(Of Person)()var products = Session.Linq<Person>();
SELECT * FROM People
Dim products = Session.Linq(Of Person)().Where(Function(p) p.Name.Contains(“eve”))
SELECT * FROM Products WHERE Name LIKE ‘%?%’; 0=‘eve’
var products = Session.Linq<Person>().Where(person=>person.Name.Contains(“eve”));
Putting It All Together
Overall Architecture
NHibernateRepository
Typed LinqRepository
AccessorType
In
te
rf
ac
e
In
te
rf
ac
e
Database
IRepository
NHibernateRepository
Database
IKillerRepository
LinqKiller
Repository
IWeaponRepository
Linq Weapon
RepositoryIVictimRepository
LinqVictim
Repository
Application
IRepository<T>
NHibernateRepository
Database
Application
IRepository<Killer> IRepository<Weapon> IRepository<Victim>
Testability
using (var session = _repository.Session) { var trans = session.BeginTransaction(); new PersistenceSpecification<Member>(session) .CheckProperty(p => p.FirstName, "First") .CheckProperty(p => p.LastName, "Last") .CheckProperty(p => p.Email, "[email protected]") .CheckList(p => p.Addresses, _listOfAddresses) .CheckReference(p => p.Company, _company) .VerifyTheMappings(); trans.Rollback(); }
Testability
DEMO!
Let’s See it In Action