2010-06-08 8 views
0

J'ai des problèmes avec Fluent nHibernate. J'ai ajouté une colonne à une table et j'ai pensé que j'avais correctement changé les mappages et les objets de données connectés pour refléter cela correctement. Cependant, quand j'ai essayé de courir à nouveau ma demande, je continuais à obtenir cette erreur:Comment déboguer Fluent nHibernate

System.Data.SqlClient.SqlException: Invalid column name 'Workflow_id'. 

je ne pouvais vraiment pas voir quel était le problème avec les changements que j'avais fait donc je revins revenir aux versions originales de la cartographie et les fichiers d'objet de données du contrôle de source et supprimé la colonne incriminée de la base de données. Mais je reçois toujours la même erreur.

Je voudrais des conseils sur la façon de déboguer cela. Le SQL qui obtient un rapport sur l'erreur est semi-absurde:

SELECT regions0_.Page_id as Page5_1_, regions0_.Id as Id1_, regions0_.Id as Id27_0_, regions0_.RegionId as RegionId27_0_, regions0_.RegionTemplate_id as RegionTe3_27_0_, regions0_.Workflow_id as Workflow4_27_0_ FROM [Region] regions0_ WHERE regions0_.Page_id=? 

Et il ne sera pas exécuté comme valide SQL de toute façon.

Des idées sur où aller?

Répondre

1

Je pense que vous n'avez pas besoin de déboguer FluentNhibernate. Le problème pourrait être dans vos conventions. Comme je comprends, vous avez un objet Région et il est référencé à un autre objet Workflow. donc définir une convention pour tout lien de référence eq:

 private Action<IConventionFinder> GetConventions() 
     { 
      return c => 
       { 
        c.Add<PrimaryKeyConvention>(); 
        c.Add<ReferenceConvention>(); 
        c.Add<HasManyConvention>(); 
        c.Add<TableNameConvention>(); 
        c.Add<PropertyNameConvention>(); 
       }; 
     } 

Utilisez cette méthode privée dans votre mise en œuvre du

public AutoPersistenceModel Generate() 

Et la convention de référence devrait être quelque chose comme:

using FluentNHibernate.Conventions; 
using FluentNHibernate.Conventions.Instances; 

public class ReferenceConvention : IReferenceConvention 
{ 
    public void Apply(IManyToOneInstance instance) 
    { 
     instance.Column(Inflector.Net.Inflector.Camelize(instance.Property.Name) + "Id"); 
    } 
} 

Vérifiez également que vous remplacez les mappages, si c'est le cas.

J'ai un exportateur unitaire qui exporte les mappages. Malheureusement, ci-dessous est une ancienne version:

[Test, Ignore("Run this test only if you want to see mappings")] 
    public void ShouldExportMappings() 
    { 
     const string mappingPath = @"mappings"; 

     if (!Directory.Exists(mappingPath)) 
      Directory.CreateDirectory(mappingPath); 

     var sessionFactory = Fluently.Configure() 
      .Database(SQLiteConfiguration.Standard.InMemory) 
      .Mappings(m => 
          { 
           m.FluentMappings 
            .AddFromAssemblyOf<User>() 
            .ExportTo(mappingPath); 

           m.AutoMappings 
            .Add(new AutoPersistenceModelGenerator().Generate()) 
            .ExportTo(mappingPath); 
          }).BuildSessionFactory(); 
    } 

Et enfin, si vous voulez vraiment debug, copier les sources FluentNHibernate de leur stockage et de l'inclure dans votre sln. Mais ce n'est pas une bonne idée car le problème est dans votre code plutôt que dans leur. Cela n'aidera pas, vous perdrez seulement du temps.

+0

Merci pour votre réponse - il y a beaucoup de choses utiles là-dedans. Cependant, il semble que la racine du problème soit beaucoup plus simple - il semble que nHibernate met en cache beaucoup de choses sur le serveur web, ce que je ne savais pas - je suppose qu'il a reconstruit toute sa structure sous-jacente à chaque fois. Arrêter/démarrer l'instance du serveur a résolu le problème sans modifier le code. –

+0

Nous avons également un unittest qui crée la base de données sur le serveur CI avant d'exécuter les unites, un autre pour le déploiement qui crée une base de données avec des données fictives pour le test manuel. Également d'autres personnes unittest nous disent si la base de données correspond aux mappages – isuruceanu