1

I've been using S#arp and have updated the Generate method in AutoPersistenceModelGenerator to work with Fluent NHibernate 1.1. I also changed its assembly name from MyProject.Data to MyProject.Infrastructure and I'm not sure which has caused the problem:

    public AutoPersistenceModel Generate()
    {
        return AutoMap.Assemblies(new myProjectMappingConfiguration(),
                                  typeof (MyClass).Assembly)
            .Conventions.Setup(GetConventions())
            .IgnoreBase<Entity>()
            .IgnoreBase(typeof (EntityWithTypedId<>))
            .UseOverridesFromAssemblyOf<AutoPersistenceModelGenerator>();
    }

At the point that Castle Windsor registers the assembly containing the above method...

        container.Register(
            AllTypes.Pick()
            .FromAssemblyNamed("MyProject.Infrastructure")
            .WithService.FirstNonGenericCoreInterface("MyProject.Core"));

...it throws this exception:

Method 'Generate' in type 'MyProject.Infrastructure.NHibernateMaps.AutoPersistenceModelGenerator' from assembly 'MyProject.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.

I've completely cleaned the project and rebuilt it but the error keeps happening.

I don't know if this makes a difference but the above method is actually called directly in Global.asax:

    private void InitializeNHibernateSession()
    {
        var cfg = NHibernateSession.Init(
            webSessionStorage,
            new string[] { Server.MapPath("~/bin/MyProject.Infrastructure.dll") },
            new AutoPersistenceModelGenerator().Generate(),
            Server.MapPath("~/NHibernate.config"));
     }

I've tried removing the IOC registration but the same error is then thrown on this method:

    public void Initialize(Action initMethod)
    {
        if (!this.NHibernateSessionIsLoaded)
        {
            lock (syncLock)
            {
                if (!this.NHibernateSessionIsLoaded)
                {
                    initMethod();
                    this.NHibernateSessionIsLoaded = true;
                }
            }
        }
    }

UPDATE

I recreated my project and unwent the same process again - the error appears to happen when I update Fluent NHibernate from 1.0 to 1.1. Any ideas why?

David Neale
  • 16,498
  • 6
  • 59
  • 85
  • Are you sure you're not loading an older version of the assembly -- possibly from the GAC? See: http://stackoverflow.com/questions/948785/typeloadexception-says-no-implementation-but-it-is-implemented – PatrickSteele Aug 19 '10 at 12:09

2 Answers2

3

I believe this was caused by part of the S#arp architecture assemblies referencing the old Fluent NHibernate version.

I updated the S#arp assemblies to 1.6 (which now uses FNH 1.1) and it now works.

David Neale
  • 16,498
  • 6
  • 59
  • 85
2

I ran into this same issue but am not ready to update my sharparch version, also I am using the 2.0.0.0 version of fluentnhibernate. You can work around this by using an assembly binding redirect in your app.config or web.config. Like this:

    <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="FluentNhibernate" publicKeyToken="8aa435e3cb308880" culture="neutral"/>
            <bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="2.0.0.0"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>
mockobject
  • 1,797
  • 16
  • 26