Couramment.Configurer un NHibernate base de données à partir d'un fichier de config?
Cette question est similaire à La configuration Couramment NHibernate de NHibernate section de configuration mais je suis encore à essayer d'envelopper mon cerveau autour de ça, et la réponse n'est pas suffisante.
Je veux faire une base de données agnostique application de gestion du stock (plus une expérience qu'autre chose). Je veux utiliser le Fluide automapper parce qu'il semble comme une idée vraiment cool si je pouvais le faire fonctionner... conserve de belles choses et génériques, et un peu les forces de l'utilisation d'un modèle.
Donc, je fais une classe d'assistance avec une SessionFactory créateur de la sorte:
private static ISessionFactory _SessionFactory;
public static ISessionFactory SessionFactory {
get {
if (_SessionFactory == null) {
var config = new Configuration().Configure();
_SessionFactory = Fluently.Configure(config)
.Mappings (m => m.AutoMappings.Add (AutoMap.AssemblyOf<Machine> ()))
.BuildSessionFactory ();
}
return _SessionFactory;
}
}
public static ISession GetSession()
{
return SessionFactory.OpenSession();
}
- Je faire une application.config comme suit:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
</configSections>
<connectionStrings>
<add name="NHDataModel" connectionString="Data Source=10.10.10.10;Integrated Security=SSPI;Database=Inventory;" />
</connectionStrings>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
<property name="connection.connection_string_name">NHDataModel</property>
<property name="show_sql">true</property>
</session-factory>
</hibernate-configuration>
</configuration>
Le message d'erreur que j'obtiens quand j'essaie de générer une session de jouer avec est comme suit:
An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
* Database was not configured through Database method.
Il n'y a pas d'exception interne.
Je pense que cela fonctionne, mais je voudrais, bien sûr, être mauvais. Un examen de l'objet de config montre qu'il a recueilli de l'information sur la propriété dans l'application de config, pourtant, ne semble pas à l'appliquer à la fluidité de la Base de données de la Méthode. J'ai vu des exemples très similaire à la présente partout sur l'internet, mais aucun ne correspondait exactement, il y a donc beaucoup de place pour les erreurs stupides.
Je suis sûr que c'est une chose simple, mais j'ai été de me gratter la tête sur cela pendant des heures. Toute aide serait grandement appréciée. Nhibernate et FluentNhibernate sont techs que je n'ai jamais utilisé avant, donc cela a été une courbe d'apprentissage abrupte.
Fluently.Configure().Database(...
fonctionne parfaitement, mais dans le Web.config, App.erreur de configuration s'affiche!Voir la accepté de répondre ci-dessous. J'ai commenté sur ce qui se passait.
Désolé, mon erreur. N'avais pas vu votre commentaire.
OriginalL'auteur Jeremy Holovacs | 2011-10-20
Vous devez vous connecter pour publier un commentaire.
Votre méthode semble judicieuse; parler Couramment NHibernate devrait en effet vous permettre de démarrer avec une Configuration et d'y ajouter. Voici le code de la fluidité de la NHibernate site, qui est sémantiquement identique à la vôtre, que vous êtes mappant automatiquement au lieu d'couramment cartographie:
La seule grosse différence que je vois est que le code ne jamais explicitement attribue l'objet de config variable sur les résultats de la méthode Configure (); cela impliquerait que les Configurer() modifie l'instance sur laquelle il est appelé, en plus de retourner un profond clone de lui-même (ou simplement lui-même).
Quelques points à vérifier: Êtes-vous SÛR que la version de Fluent vous êtes à l'aide de références à une version de NHibernate qui utilise la configuration de la version 2.2? FNH 1.2 objectifs NH 3.1, tandis que la FNH 1.1 objectifs NH 2.1.2 GA. Je ne sais pas quelle configuration versions de ceux qui l'utilisent, mais si elles correspondent à l'hôtel NH version de la méthode Configure() ne peut pas être de trouver la section de configuration correspondant à la ConfigSectionHandler qu'il utilise.
OK, j'ai vérifié et je suis en effet sous NHibernate 3.1 et FNH 1.2.
OriginalL'auteur KeithS
Je pense que Keith est juste que tu n'es pas le remplissage de la NHibernate de configuration que vous avez en
Fluently.Configure
, et donc votre configuration est fondamentalement ignoré. Je sais que vous pouvez garder ces paramètres dans le fichier de configuration, mais si vous êtes prêt à ignorer le fichier de configuration, vous pouvez également faireSi vous le faites, vous n'avez plus besoin
<hibernate-configuration>
dans votre fichier de configuration, et cela devrait résoudre votre problème.Bien sûr, je peux comprendre qu'à partir d'une pratique d'exercice point de vue. Gardez à l'esprit que dans la plupart des cas, cependant, si vous avez besoin de changer l'intégralité de l'application d'un type de base de données à l'autre, alors vous avez probablement ne se soucient pas de la recompilation de la dll. Si cette circonstance ne viennent, comme disons que vous êtes à la mise à niveau vers Sql Server 2008, alors vous avez juste besoin de changer
MsSqlConfiguration.MsSql2005
àMsSqlConfiguration.MsSql2008
. La plate-forme est encore de base de données agnostique.OriginalL'auteur Mike Richards
Bien merci pour le test de cohérence. Il s'avère que le problème a à voir avec le mappant automatiquement la configuration, rien à voir avec la base de données. Le message d'erreur a été de me lancer et de m'obligeant à regarder dans la mauvaise place. Je pense que je vais faire une remarque sur la fluidité de forum que le mauvais message est popping up dans ce scénario, de sorte que d'autres personnes de ne pas tourner leurs roues sur ce.
Il ne pouvait pas déduire la colonne Id (j'ai été à l'aide de <objectName>ID au lieu de l'Id)... une fois que je l'ai dit ce qu'il faut chercher, l'erreur a disparu.
OriginalL'auteur Jeremy Holovacs