2010-08-26 7 views
5

J'ai deux tables, les lieux et installationsCourant NHibernate AutoMapping ne pas créer le nom de table Plural

Ils carte à deux classes,

public Location : Entity 
{ 
    //properties 
} 

public Facility : Entity 
{ 
    public virtual Location Location { get; set; } 
} 

Tout fonctionne dandy, jusqu'à ce que je change installation à ce

public Facility : Location 
{ 

} 

maintenant, je reçois une exception NHibernate disant

NHibernate.ADOException was unhandled by user code 
    Message=could not execute query 
InnerException: System.Data.SqlClient.SqlException 
     Message=Invalid object name 'Facility'. 

Pour une raison quelconque, il ne crée pas le nom pluriel de la table dans la chaîne sql.

Merci pour toute aide!

EDIT

Ceci est mon TableNameConvention actuelle

public class TableNameConvention : IClassConvention 
{ 
    public void Apply(FluentNHibernate.Conventions.Instances.IClassInstance instance) 
    { 
     instance.Table(Inflector.Net.Inflector.Pluralize(instance.EntityType.Name)); 
    } 
} 

Lorsque Facility hérite de l'entité, le Fonds ne court par cette méthode. Quand il hérite de localisation, il ne

Edit 2 FIGURED je poste tout ... Database diagram

public class AutoPersistenceModelGenerator : IAutoPersistenceModelGenerator 
{ 

    #region IAutoPersistenceModelGenerator Members 

    public AutoPersistenceModel Generate() 
    { 
     var mappings = new AutoPersistenceModel(); 
     mappings.AddEntityAssembly(typeof(Person).Assembly).Where(GetAutoMappingFilter); 
     mappings.Conventions.Setup(GetConventions()); 
     mappings.Setup(GetSetup()); 
     mappings.IgnoreBase<Entity>(); 
     mappings.IgnoreBase(typeof(EntityWithTypedId<>)); 
     mappings.UseOverridesFromAssemblyOf<AutoPersistenceModelGenerator>(); 

     return mappings; 

    } 

    #endregion 

    private Action<AutoMappingExpressions> GetSetup() 
    { 
     return c => 
     { 
      c.FindIdentity = type => type.Name == "Id"; 
     }; 
    } 

    private Action<IConventionFinder> GetConventions() 
    { 
     return c => 
     { 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.ForeignKeyConvention>(); 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.HasManyConvention>(); 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.HasManyToManyConvention>(); 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.ManyToManyTableNameConvention>(); 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.PrimaryKeyConvention>(); 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.ReferenceConvention>(); 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.TableNameConvention>(); 
     }; 
    } 

    /// <summary> 
    /// Provides a filter for only including types which inherit from the IEntityWithTypedId interface. 
    /// </summary> 

    private bool GetAutoMappingFilter(Type t) 
    { 
     return t.GetInterfaces().Any(x => 
             x.IsGenericType && 
             x.GetGenericTypeDefinition() == typeof(IEntityWithTypedId<>)); 
    } 
} 
+0

Fluent NHibernate ne fait pas la pluralisation des noms de table, ni rien d'autre d'ailleurs. Vous devez créer une convention comme David a suggéré et utiliser l'un des inflecteurs .Net là-bas. –

+0

La tableNameConvention est présente, mais pour une raison quelconque, lorsque je modifie Facility pour hériter de Location, l'installation courante ne la trouve plus lors de l'analyse de l'assembly. –

+0

En l'état, il semble que vous traitez Location comme une autre classe de base, auquel cas les éléments suivants peuvent fonctionner: mappings.IgnoreBase (); Ou allez-vous quelque chose comme une table par sous-classe? – David

Répondre

8

Avez-vous fixé un convention?

public class TableNameConvention : IClassConvention 
{ 
    public void Apply(FluentNHibernate.Conventions.Instances.IClassInstance instance) 
    { 
     string typeName = instance.EntityType.Name; 

     instance.Table(Inflector.Net.Inflector.Pluralize(typeName)); 
    } 
} 
+0

Ouais c'est là. Pour une raison quelconque, lorsque je modifie l'installation pour qu'elle hérite de l'emplacement, Facility n'apparaît pas pour être ajouté dans cette convention de nom de table. –

+0

Euh, intéressant. Alors utilisez-vous une stratégie d'héritage? - http://jagregory.com/writings/fluent-nhibernate-auto-mapping-and-base-classes/ – David

+0

Yep. Il ressemble à celui de l'exemple. Voici un lien: http://yfrog.com/1gdhfp –

1

Ceci est une question ancienne, mais pour le bien des autres qui trébuchent sur cette recherche d'une réponse, vous pouvez également créer une convention qui utilise le PluralizationService intégré qui est livré avec EF:

public class TableNameConvention : IClassConvention 
{ 
    public void Apply(IClassInstance instance) 
    { 
     string typeName = instance.EntityType.Name; 
     instance.Table(PluralizationService.CreateService(CultureInfo.CurrentCulture).Pluralize(typeName)); 

    } 
} 
+0

Mélange intéressant de nhibernate et EF. Nous n'avions pas le droit d'utiliser EF pour ce projet il y a des années. –

Questions connexes