NHibernate 2.0: Cfg.Configuration.SetProperties Problema con IDictionary
-
20-08-2019 - |
Domanda
Ho un problema con:
NHibernate.Cfg.Configuration.SetProperties()
Non accettare l'IDictionary: NHibernateConfigHandler
Ricevo i messaggi:
Errore 30 La migliore corrispondenza del metodo sovraccarico per "NHibernate.Cfg.Configuration.SetProperties (System.Collections.Generic.IDictionary)" ha alcuni argomenti non validi
e
Errore 31 Argomento '1': impossibile convertire da 'System.Collections.IDictionary' a 'System.Collections.Generic.IDictionary'
Per favore avvisare?
L'intero metodo:
/// <param name="config">NHibernate configuration</param>
public ISessionFactory GetSessionFactoryFor(NHibernateConfigHandler config)
{
if (config == null)
throw new ArgumentNullException("config may not be null nor empty");
ISessionFactory sessionFactory = GetSessionFactoryFor(config.MappingAssembly);
// Failed to find a cached SessionFactory so make a new one.
if (sessionFactory == null)
{
NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();
cfg.SetProperties(config.Properties); //THIS LINE
cfg.AddAssembly(config.MappingAssembly);
// Now that we have our Configuration object, create a new SessionFactory
sessionFactory = cfg.BuildSessionFactory();
if (sessionFactory == null)
{
throw new InvalidOperationException("cfg.BuildSessionFactory() returned null.");
}
HttpRuntime.Cache.Add(config.MappingAssembly, sessionFactory, null, DateTime.Now.AddDays(7),
TimeSpan.Zero, CacheItemPriority.High, null);
}
return sessionFactory;
}
Soluzione
La firma di SetProperties è
public NHibernate.Cfg.Configuration SetProperties(System.Collections.Generic.IDictionary<string,string> newProperties)
Member of NHibernate.Cfg.Configuration
Setproperties sta prendendo il parametro di tipo IDictionary, ovvero Dizionario generico. E stai provando a passare in IDictionary. Questo è il motivo dell'errore.
È possibile modificare il tipo di proprietà in NHibernateConfigHandler in System.Collections.Generic.IDictionary. O Crea un System.Collections.Generic.IDictionary e copia tutti i valori da System.Collections.IDictionary.
È sempre efficiente utilizzare il dizionario generico (che si trova su System.Collections.Generic) su IDictionary (che si trova su System.Collections).