Domanda

Sto provando la capacità di automappamento di fluente nhibernate e lo stesso codice che ha funzionato con esplicito ClassMap le configurazioni non riescono quando si costruisce il SessionFactory Quando provo a spostarlo in automappamento.

Ecco il codice:

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'errore che ricevo è:

È stata utilizzata una configurazione non valida o incompleta durante la creazione di una sessione. Controlla la raccolta di potenzialireason e l'innerexception per maggiori dettagli.

ottengo Count = 0 per PotentialReasons E l'eccezione interna è la stessa di cui sopra.

Lo stacktrace si riferisce a:

a fluntNhibernate.cfg.fluentConfiguration.buildsessionFactory () in d: builds fluntNH-v1.x-nh3 src fluentNhibernate cfg fluentconfiguration.cs: linea 113

Sembra che io abbia provato di tutto per farlo funzionare, e il più vicino che sono venuto è stato quello di far funzionare l'inizializzazione solo per ottenere un Could not find persister for... Errore quando ho provato a usare la sessione e non ricordo nemmeno come sono stato in grado di farlo accadere.

Sto usando il database Build #694 con il database NHIBERNATE 3.0, SQL 2008. Qualche idea su cosa sto facendo di sbagliato?

È stato utile?

Soluzione

Questo è stato un errore stupido che il commento di Aliostad mi ha aiutato a trovare. Avevo un tipo enum che era stato archiviato come un numero intero nel database e Nhibernate lo stava soffocando. Ho aggiunto un enumconvenzione alla configurazione in questo modo:

_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();

Ecco quella convenzione di Enum:

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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top