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 ...
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<>));
}
}
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. –
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. –
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