Fluente Nhibernate Automap Configurazione che lancia un errore vago
-
13-11-2019 - |
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?
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);
}
}