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