Making NHibernate Burrow work with NHibernate 2.1
15 Comments Published by Erik Burger August 28th, 2009 in ProgrammingIn my previous post I introduced Fluent NHibernate and NHibernate Burrow. If you have been trying the two together, you’ll have noticed that Burrow has been compiled against a lower version (2.0) of NHibernate than Fluent NHibernate has (which uses 2.1).
Trying to use Burrow with the newer version of NHibernate results in the following exception being thrown:
FileLoadException: Could not load file or assembly ‘NHibernate,
Version=2.0.1.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4′
or one of its dependencies. The located assembly’s manifest definition
does not match the assembly reference. (Exception from HRESULT:
0×80131040)
In order to solve this, you could go out and get the Burrow source code from here and compile your own version against NHibernate 2.1. But that’s a lot of work which should become obsolete when the next version of Burrow (or NHibernate) comes out. Instead, you can use assembly redirection.
In your web.config file, add the following:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="NHibernate" publicKeyToken="aa95f207798dfdb4"/> <bindingRedirect oldVersion="2.0.1.4000" newVersion="2.1.0.4000"/> </dependentAssembly> </assemblyBinding> </runtime>
And that’s all you need. Now, whenever some library (read: Burrow) asks for NHibernate 2.0, it’ll be redirected to NHibernate 2.1.
I hope this post was useful to you.
Erik


This solution got me most of the way there. I had to add two more binding redirections in my project (The last because I’m using .Net 3.5).
Here are my additional binding redirections.
However I still get an error due to what looks like a breaking change in NHibernate 2.1. The signiture for NHibernate.Engine.ISessionFactoryImplementor.GetEntityPersister(System.String, Boolean) is now NHibernate.Engine.ISessionFactoryImplementor.GetEntityPersister(System.String). Here’s the error:
[MissingMethodException: Method not found: 'NHibernate.Persister.Entity.IEntityPersister NHibernate.Engine.ISessionFactoryImplementor.GetEntityPersister(System.String, Boolean)'.]
NHibernate.Burrow.Impl.PersistenceUnitRepo.GetPU(Type t) 0
NHibernate.Burrow.Impl.AbstractConversation.GetSessionManager(Type t) 26
NHibernate.Burrow.Impl.AbstractConversation.GetSession(Type entityType) 13
NHibernate.Burrow.BurrowFramework.GetSession(Type entityType) 23
NHibernate.Burrow.AppBlock.DAOBases.GenericDAO`1.get_Session() 36
NHibernate.Burrow.AppBlock.DAOBases.GenericDAO`1.CreateCriteria() 20
…
Thanks a lot for your last two posts,
they are really valuable to keep all things updated
Hi Robert,
It seems that your post got a bit garbled. If you drop me a line at eburger at reversealchemy.net I can take a look and maybe help you out. I am using .Net 3.5 myself and the binding I described was all I needed. I’d love to help you figure out the rest.
Erik
My pleasure Luca. It’s projects like Fluent and Burrow that make NHibernate a pleasure to use..imho far more than any other product I’ve seen. So anything I can do to help is my privilege
Erik
Hi Erik… today i have tried to apply your suggestion in my current project and i receive the same error Robert encounter…
so i have solved this problem simply by removing assembly redirection inside web.config and after having compiled only the main nhibernate burrrow project, i simply have referenced the new nhibernate.burrow assembly… to compile nhibernate burrow against the latest nh release as Robert suggested it’s necessary to remove a parameter from GetEntityPersister method…
basically it works with the old school way
Hi Luca,
I am glad you got it working though I am still stumped as to why it does work for me. Of course, the excuse “it works on my machine” totally doesn’t apply
so I will look into it some more as soon as my calendar frees up a bit. If I find anything I’ll be sure to update my post.
Cheers,
Erik
Hi Erik,
Just to confirm that there are a few breaking changes; one in the Burrow dll and three in Burrow.AppBlock dll (you may not use the latter).
In Burrow:
On line 51 of PersistenceUnitRepo.cs. Just remove the extra ‘false’ parameter on the method. The GetEntityPersister method seems to take only one argument in the 2.1 version of NHibernate.
In Burrow.AppBlock:
On line 63 of PaginableCriteria.cs change ‘cloned.Orders.Clear();’ to ‘cloned.ClearOrders();’
On line 307 of GenericDAO.cs change ‘c.Orders.Clear();’ to ‘c.ClearOrders();’
There’s also an interface (AbstractCriterion) which has been extended in the new NHibernate to include a GetProjections() method, so you need to add the extra method on EqOrNullExpression, which implements this.
public override IProjection[] GetProjections()
{
return null;
}
If you have Visual Studio it’s pretty easy to download the source, change the reference to NHibernate to the newer version and recompile with the four changes.
I hope this helps someone
David
Hi David,
Thank you very much for your input! I am positive it will indeed help out some.
Regards,
Erik
Just thought I’d mention the problem I had when building Burrow against NHibernate 2.1. It seems that if you have Burrow configured to use more than one database it doesn’t work. I kept getting the ‘NHibernate.MappingException: No persister for: ‘ error, and I couldn’t figure out what I had done wrong. So, I downloaded NHibernate 2.0, and set it up with that, and it worked fine.
Hey Erik,
This page has been tremedously helpful (just started using nhibernate). I have an issue in my unit test teardown when i call the BurrowFramwork method CloseWorkspace and it just hangs and never finishes. Any Ideas? I can retrieve “A” object from a unit test just fine, but it hangs after retrieving “B” object. I’m using Nhibernate 2.1 with Fluent and Burrow. Thanks.
-Jay
Hi Jay,
I am not sure I understand your problem 100% but I do not use Burrow’s xxxWorkspace methods in my unit test code. In my setup I use new BurrowFramework().GetSession() to create a session, then in my teardown I use session.Close() and session.Dispose() to clean up. Perhaps using that method resolves your problem?
Erik
Hey Erik,
I ended up recompiling Burrow with the newer version of Nhibernate (2.1) and used the comments from David Carr, and it works fine now. Thanks for the info!
-Jay
Hi Jay,
No problem, you are very welcome.
Erik
For everyone interested, I have compiled Burrow for use with NHibernate 2.1.2.4000 using the instructions from David. You can download it here:
http://depositfiles.com/files/uusw4aita
It contains:
NHibernate.Burrow.AppBlock.dll
NHibernate.Burrow.dll
NHibernate.Burrow.WebUtil.dll
NHibernate.JetDriver.dll
I have also included NHibernate.JetDriver compiled against NHibernate 2.1.2.4000. Most people won’t need it, it’s a Driver for using NHibernate with Microsoft Access, but maybe someone will find it useful. If you don’t use Microsoft Access, delete this file.
Remove all assembly redirects regarding NHibernate from your web.config / app.config file, you won’t need them any more with these dll files.
For any questions email filzstiftegmxde
Thanks for that sss, that’s a great help!