Question

J'essaye la capacité automnapée de Nhibernate courant, et le même code qui a fonctionné avec explicite ClassMap Les configurations échouent lors de la construction du SessionFactory Quand j'essaie de le déplacer vers l'automapplication.

Voici le code:

public static ISessionFactory GetSessionFactory()
{
    if (_sessionFactory == null)
    {
        _sessionFactory = Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("DB")))
            // It works with the following:
            // .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Customer>())
            // It fails with this:
            .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Customer>()))
            .BuildSessionFactory();

    return _sessionFactory;
}

L'erreur que j'obtiens est:

Une configuration non valide ou incomplète a été utilisée lors de la création d'un SessionFactory. Vérifiez la collection de rérécisions potentielles et inserexception pour plus de détails.

Je reçois Count = 0 pour PotentialReasons Et l'exception intérieure est la même que ci-dessus.

Le stacktrace fait référence à:

sur fluentnhibernate.cfg.fluentConfiguration.buildSessionFactory () dans d: builds fluentnh-v1.x-nh3 src fluientnhibernate cfg fluentConfiguration.cs: ligne 113

Il semble que j'ai tout essayé pour le faire fonctionner, et le plus proche que je venais était d'avoir le travail d'initialisation uniquement pour obtenir un Could not find persister for... Erreur lorsque j'ai essayé d'utiliser la session, et je ne me souviens même pas comment j'ai pu faire en sorte que cela se produise.

J'utilise la Build # 694 avec la base de données NHibernate 3.0, SQL 2008. Des idées que je fais de mal?

Était-ce utile?

La solution

Ce fut une erreur stupide que le commentaire d'Aliostad m'a aidé à trouver. J'avais un type d'énumération qui a été stocké comme un entier dans la base de données, et Nhibernate s'étouffait à ce sujet. J'ai ajouté un énumconvention à la configuration comme ceci:

_sessionFactory = Fluently.Configure()
    .Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("DB")))
    .Mappings(
        m =>
        m.AutoMappings.Add(AutoMap.AssemblyOf<Customer>(new AutomapConfiguration()).Conventions.
                               Setup(c =>
                                         {
                                             c.Add<PrimaryKeyConvention>();
                                             c.Add<EnumConvention>();
                                             c.Add<CascadeAllConvention>();
                                         })
                               .IgnoreBase(typeof (EntityBase<>))
                               .OverrideAll(map => map.IgnoreProperty("IsValid"))))
    .BuildSessionFactory();

Voici cette convention en énumération:

public class EnumConvention : IUserTypeConvention
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Property.PropertyType.IsEnum);
    }

    public void Apply(IPropertyInstance target)
    {
        target.CustomType(target.Property.PropertyType);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top