2010-08-26 12 views
5

Ho due tabelle, luoghi e struttureFluent NHibernate Automapping non creare plurale nome della tabella

Essi mappano due classi,

public Location : Entity 
{ 
    //properties 
} 

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

tutto funziona da dandy, fino a cambiare la funzione per questo

public Facility : Location 
{ 

} 

Ora ottengo un'eccezione da NHibernate dicendo

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

Per qualche motivo non sta creando il nome plurale della tabella nella stringa sql.

Grazie per qualsiasi aiuto!

EDIT

Questo è il mio attuale TableNameConvention

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

Quando Struttura eredita da Entità, il Fondo viene eseguito attraverso questo metodo. Quando si eredita da posizione, lo fa non

Edit 2 Ho pensato di inviare tutto ... 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

Fluente NHibernate non fa alcuna pluralizzazione di nomi di tabelle, o qualsiasi altra cosa per quella materia. Devi creare una convention come David ha suggerito e utilizzare uno degli infector .Net là fuori. –

+0

La tableNameConvention è in là, ma per qualche motivo quando cambio Facility per ereditare da Location, la fluente impostazione non la trova più quando esegue la scansione dell'assembly. –

+0

Così com'è, sembra che tu stia trattando Location come un'altra classe base, nel qual caso potrebbe funzionare: mappings.IgnoreBase (); O stai andando per qualcosa come un tavolo per sottoclasse? – David

risposta

8

Avete impostare 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

Sì, qui dentro. Per qualche motivo, quando cambio l'impianto da ereditare da posizione, l'impianto non viene visualizzato in questa convenzione del nome di tabella. –

+0

Euh, interessante. Quindi stai usando una strategia di ereditarietà? - http://jagregory.com/writings/fluent-nhibernate-auto-mapping-and-base-classes/ – David

+0

Sì. Assomiglia a quello nell'esempio. Ecco un link: http://yfrog.com/1gdhfp –

1

Questa è una vecchia questione, ma per il bene di altri che imbattervi in ​​questo alla ricerca di una risposta, è anche possibile creare una convenzione che utilizza il built-in PluralizationService che viene fornito con EF:

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

    } 
} 
+0

Interessante mix di nibernato e EF. Non ci è stato permesso di usare EF per questo progetto anni fa. –

Problemi correlati