Fluent nHibernate Automapping не создает имя таблицы во множественном числе

У меня есть две таблицы, Места и Услуги

Они соответствуют двум классам,

public Location : Entity
{
   //properties
}

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

Все работает просто денди, пока я не поменяю средство на это

public Facility : Location
{

}

Теперь я получаю исключение от nHibernate, говорящего

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

По какой-то причине он не создает имя таблицы во множественном числе в строке sql.

Спасибо за любую помощь!

РЕДАКТИРОВАТЬ

Это моя текущая TableNameConvention

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

Когда Facility наследуется от Entity, Facility выполняет этот метод. Когда он наследуется от Location, он не

Редактировать 2 Решил, что опубликую все... Диаграмма базы данных

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

person Jason More    schedule 26.08.2010    source источник
comment
Fluent NHibernate не использует множественное число имен таблиц или что-либо еще в этом отношении. Вам нужно создать соглашение, как предложил Дэвид, и использовать один из инфлекторов .Net.   -  person James Gregory    schedule 27.08.2010
comment
TableNameConvention находится там, но по какой-то причине, когда я меняю Facility на наследование от Location, fluent setup больше не находит его при сканировании сборки.   -  person Jason More    schedule 27.08.2010
comment
Как есть, похоже, что вы рассматриваете Location как еще один базовый класс, и в этом случае может работать следующее: maps.IgnoreBase‹Location›(); Или собираетесь что-то вроде таблицы для подкласса?   -  person David    schedule 27.08.2010
comment
Я пытаюсь сделать таблицу для подкласса. В Location есть много свойств, на которые мне нужно ссылаться.   -  person Jason More    schedule 27.08.2010
comment
Вы решили эту проблему?   -  person Serhiy    schedule 12.02.2011


Ответы (2)


Установили ли вы соглашение?

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

        instance.Table(Inflector.Net.Inflector.Pluralize(typeName));
    }
}
person David    schedule 26.08.2010
comment
Да, это там. По какой-то причине, когда я изменяю Facility для наследования от местоположения, Facility не появляется для добавления в это соглашение об именах таблиц. - person Jason More; 27.08.2010
comment
Эх, интересно. Итак, вы используете стратегию наследования? - jagregory.com/writings/ - person David; 27.08.2010
comment
Ага. Выглядит так же, как в примере. Вот ссылка: yfrog.com/1gdhfp - person Jason More; 27.08.2010
comment
Был бы признателен, если бы вы указали, к какой сборке относится Inflector.Net.Inflector.Pluralize? - person Nano Taboada; 01.09.2011
comment
Это сборка под названием Inflector.Net. Похоже, в последнее время это двигается. weblogs.asp.net/srkirkland/archive/ 15.03.2011/ - person David; 02.09.2011

Это старый вопрос, но для тех, кто наткнется на него в поисках ответа, вы также можете создать соглашение, использующее встроенный PluralizationService, поставляемый с EF:

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

    }
}
person Derek Greer    schedule 28.05.2013
comment
Интересное сочетание nhibernate и EF. Несколько лет назад нам не разрешили использовать EF для этого проекта. - person Jason More; 28.05.2013