I thought it was time to use fluent nhibernate just to keep up. Up untill now I still use the old atributes and nhibernate 1.2.1 because I see no reason to upgrade. It all just works and does what it is supposed to do.

But I don’t want to stand in the way of progress and I want to help the VB.Net community ahead. So that Jeremy can feel a bit better about the VB.Net community ;-).

First thing I did was checkout the trunk versions of nHibernate and fluentnhibernate

Then I made a huge database with one table in it. I used SQL server 2005 64 bits (just in case Ted is reading this) for this.

this is the one table magic.

USE [fluentnhibernate]
GO
/****** Object:  Table [dbo].[Person]    Script Date: 01/12/2009 10:54:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Person](
	[Id] [uniqueidentifier] NOT NULL CONSTRAINT [DF_Person_Id]  DEFAULT (newid()),
	[LastName] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
	[FirstName] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
) ON [PRIMARY]```
And I filled up the table with this.

```tsql
INSERT INTO [fluentnhibernate].[dbo].[Person]
           ([LastName]
           ,[FirstName])
     VALUES
           ('Baes'
           ,'Christiaan')

INSERT INTO [fluentnhibernate].[dbo].[Person]
           ([LastName]
           ,[FirstName])
     VALUES
           ('Gobo'
           ,'Denis')```
So the corresponding model class should be simple enough too.

```vbnet
Namespace Model
    Public Class Person
        Private _id As Guid
        Private _lastName As String
        Private _firstName As String

        Public Sub New()
            _id = Guid.NewGuid
            _lastName = ""
            _firstName = ""
        End Sub

        Public Overridable Property Id() As Guid
            Get
                Return _id
            End Get
            Set(ByVal value As Guid)
                _id = value
            End Set
        End Property

        Public Overridable Property LastName() As String
            Get
                Return _lastName
            End Get
            Set(ByVal value As String)
                _lastName = value
            End Set
        End Property

        Public Overridable Property FirstName() As String
            Get
                Return _firstName
            End Get
            Set(ByVal value As String)
                _firstName = value
            End Set
        End Property

    End Class
End Namespace```
First of all I added the fluentnhibernate project to my new solution, quickly noticing that it was not wise to call my testproject fluentnhibernate and even quicker changing that to fluentnhibernatetest.

I also added nhibernate to the solution.

And I added them as a reference to the testproject.

And then I did this.

```vbnet
Option Infer On

Imports FluentNHibernate.AutoMap
Imports fluentnhibernatetest.Model
Imports FluentNHibernate

Namespace Dal
    Public Class nHibernateConfiguration
        Public Shared SessionFactory As NHibernate.ISessionFactory
        Public Shared ConnectionString As String = "Server=servername;Database=fluentnhibernate;Trusted_Connection=True;"

        Public Shared Function confignhibernate() As NHibernate.ISessionFactory
            Dim properties = New Dictionary(Of String, String)
            properties.Add("connection.connection_string", ConnectionString)
            properties.Add("connection.provider", "NHibernate.Connection.DriverConnectionProvider")
            properties.Add("dialect", "NHibernate.Dialect.MsSql2005Dialect")
            properties.Add("connection.driver_class", "NHibernate.Driver.SqlClientDriver")
            properties.Add("show_sql", "true")
            properties.Add("proxyfactory.factory_class", "NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu")

            Dim autoMappings = AutoPersistenceModel _
                                    .MapEntitiesFromAssemblyOf(Of Person) _
                                    .Where(Function(t) t.Namespace = "fluentnhibernatetest.Model")

            SessionFactory = New NHibernate.Cfg.Configuration() _
                                            .AddProperties(properties) _
                                            .AddAutoMappings(autoMappings) _
                                            .BuildSessionFactory()
            Return SessionFactory
        End Function
    End Class
End Namespace```
which meant I also had to import and reference the NHibernate.ByteCode.Linfu project/assembly. Cant’t remember ever needing that.

And of course I also neede something to run this and see if it worked. Of course I could have created a testproject but what’s the fun in that.

```vbnet
Option Infer On

Imports fluentnhibernatetest.Model
Imports NHibernate

Module Module1

    Sub Main()
        Try
            Dim sessionfactory = Dal.nHibernateConfiguration.confignhibernate
            Dim session As ISession = sessionfactory.OpenSession()
            Dim _ReturnList = session.CreateCriteria(GetType(Model.Person)).List(Of Model.Person)()
            For Each Person In _ReturnList
                Console.WriteLine(Person.Id.ToString & " " & Person.LastName & " " & Person.FirstName)
            Next
        Catch ex As Exception
            Console.WriteLine(ex.Message)
            Console.WriteLine(ex.StackTrace)
        End Try
        Console.ReadLine()
    End Sub

End Module

With this as the result of all our hard labor.

Not that difficult ;-).

I will do a more elaborate test later on.

Once again thanks to the guys that sacrificied their time and energy in making this happen.

you can also find more examples in C# here by James Gregory.