2010-04-03 5 views
2

Je vais avoir quelques problèmes en utilisant NHibernate, AutoMapping et une structure de classe en utilisant plusieurs chaînes de classes abstraitesNHibernate, AutoMapping et Chained Résumé Classes

Il est quelque chose de semblable à ce

public abstract class AbstractClassA {} 

public abstract class AbstractClassB : AbstractClassA {} 

public class ClassA : AbstractClassB {} 

Lorsque je tente de générer ces mappages, je reçois l'erreur suivante

"FluentNHibernate.Cfg.FluentConfigurationException n'a pas été gérée Message: Une configuration non valide ou incomplète a été utilisée lors de la création d'une SessionFactory . Vérifiez la collection PotentialReasons et InnerException pour plus de détails.

  • Base de données n'a pas été configuré par la méthode de base de données. »

Cependant, si je retire le mot-clé abstrait de AbstractClassB, tout fonctionne très bien. Le problème ne se produit que lorsque j'ai plus d'une classe abstraite dans la hiérarchie de classes.

J'ai configuré manuellement le AutoMapping inclure à la fois AbstractClassA et AbstractClassB utilisant la classe de liaison suivante

public class BindItemBases : IManualBinding 
{ 
    public void Bind(FluentNHibernate.Automapping.AutoPersistenceModel model) 
    { 
     model.IncludeBase<AbstractClassA>(); 
     model.IncludeBase<AbstractClassB>(); 
    } 
} 

J'ai dû faire un peu de piratage pour contourner ce problème, mais il doit y avoir une meilleure façon de le faire fonctionner. Nhibernate supporte sûrement quelque chose comme ça, je n'ai juste pas compris comment le configurer correctement.

Cheers,

James

Répondre

0

Pourquoi vous incluez les classes abstraites dans vos AutoMappings, sont-ils présentés dans la base de données aussi? Pourriez-vous fournir l'exception interne Fluent throws?

model.IncludeBase<AbstractClassA>(); 
model.IncludeBase<AbstractClassB>(); 

Avec cela en place que vous essayez de la carte AbstractClassB à la base de données, ce qui est soi-disant pas ce que vous voulez.

+0

Je veux les inclure car il en existe quelques classes différentes. Si je retire le résumé, tout fonctionne bien, mais je préférerais ne pas le faire. Si je n'inclue pas la base, les classes dérivées recevront chacune leur propre table. Je ne veux pas ça. Si ClassA dérive directement de AbstractClassA, les choses fonctionnent exactement comme je le veux. C'est quand j'ajoute l'AbstractClassB au milieu qu'il tombe. –

+0

Pourquoi ne pas simplement exclure AbstractClassB des mappages, tout en le laissant en tant que classe de base? –

+0

Si j'exclue AbstractClassB des mappings, j'obtiens une exception de mappage sur les lignes de 'Une association de la table ClassA se réfère à une classe non mappée: AbstractClassB' –

Questions connexes