2010-08-26 19 views
5

Tengo dos tablas, Ubicaciones e instalacionesFluido NHibernate Automapping no crear Plural nombre de la tabla

Se corresponden a dos clases,

public Location : Entity 
{ 
    //properties 
} 

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

todo funciona dandy, hasta que cambie las instalaciones a este

public Facility : Location 
{ 

} 

Ahora consigo una excepción a NHibernate diciendo

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

Por alguna razón, no está creando el nombre plural de la tabla en la cadena sql.

¡Gracias por cualquier ayuda!

EDITAR

Ésta es mi TableNameConvention actual

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

Cuando Fondo hereda de la entidad, el Fondo se ejecuta a través de este método. Cuando se hereda de la ubicación, no

Editar 2 imaginé que había puesto todo ... 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

Fluido NHibernate no hace ninguna pluralización de nombres de tabla, o cualquier otra cosa para el caso. Debes crear una convención como David sugirió y utilizar uno de los .inflectors .Net que existen. –

+0

TableNameConvention está ahí, pero por alguna razón cuando cambio Facility para heredar desde Location, la configuración fluida ya no la encuentra cuando escanea el ensamblado. –

+0

Tal como está, parece que está tratando a Location como otra clase base, en cuyo caso podría funcionar lo siguiente: mappings.IgnoreBase (); ¿O están buscando algo así como una tabla por subclase? – David

Respuesta

8

se ha marcado 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í, eso está ahí. Por alguna razón, cuando cambio el Fondo para que herede de la ubicación, Facility no aparece para agregarse en esta convención de nombre de tabla. –

+0

Euh, interesante. Entonces, ¿estás usando una estrategia de herencia? - http://jagregory.com/writings/fluent-nhibernate-auto-mapping-and-base-classes/ – David

+0

Sí. Se ve como el del ejemplo. Aquí hay un enlace: http://yfrog.com/1gdhfp –

1

Ésta es una cuestión de edad, sino por el bien de otros que se tropiezan con esta buscando una respuesta, también puede crear una convención que utiliza el incorporado en PluralizationService que viene 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

Mezcla interesante de nhibernate y EF. No se nos permitió usar EF para este proyecto hace años. –

Cuestiones relacionadas