INamingStrategy игнорируется (свободно) NHibernate? - PullRequest
2 голосов
/ 04 июня 2010

Я пытаюсь написать стратегию именования для NHibernate, которая будет добавлять префиксы к именам таблиц в зависимости от того, в какой сборке определено poco. Сейчас моя стратегия просто пытается добавить любой префикс к таблицам, чтобы доказать, что у меня есть вещи подключен правильно.

Проблема, с которой я сталкиваюсь, заключается в том, что я могу создать свой INamingStrategy и присоединить его к объекту конфигурации NHibernate, но, кажется, он никогда не используется. Вот пример кода:

private MsSqlConfiguration GetDatabaseConfiguration()
{
 var configuration = MsSqlConfiguration.MsSql2008
  .ConnectionString(ConfigFileReader.GetConnectionString(ConnectionStringKey))
  .ShowSql();                
 return configuration;
}

private FluentConfiguration GetFluentConfiguration()
{
 return Fluently.Configure().Database(GetDatabaseConfiguration())
  .Mappings(m =>
  {
   foreach (var assembly in GetAssembliesToLoadMappingsFrom())
    m.FluentMappings.AddFromAssembly(assembly);
  });
}

public global::NHibernate.Cfg.Configuration GetNHibernateConfiguration()
{
 var nHibernateConfiguration = GetFluentConfiguration().BuildConfiguration();
 var namingStrategy = GetNamingStrategy();
 if (namingStrategy != null)
  nHibernateConfiguration.SetNamingStrategy(namingStrategy);
 return nHibernateConfiguration;
}

public void Build()
{
 var schemaExport = new SchemaExport(GetNHibernateConfiguration());

 schemaExport.Create(true, true);
}

Поместив точку останова в оператор return в GetNHibernateConfiguration (), я могу подтвердить, что nHibernateConfiguration.NamingStrategy содержит ссылку на мою стратегию. Однако размещение точек останова в каждом из членов этой стратегии, реализующих INamingStrategy, показывает, что ни один из них никогда не вызывается. Это подтверждается просмотром сгенерированной схемы, у которой нет префиксов.

Аналогично, используя тот же подход для создания фабрики сеансов, показывает, что операции CRUD также игнорируют стратегию.

Я что-то упускаю из виду?

Я использую NHibernate 2.1.1.4000

1 Ответ

0 голосов
/ 08 июня 2010

Я думаю, что ваша стратегия слишком сложна. Если вы используете FluentNHibertate, просто укажите соглашение TableName при инициализации.

e.q:.

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

и использование здесь:

public class AutoPersistenceModelGenerator : IAutoPersistenceModelGenerator
    {
        /// <summary>
        /// Get Conf Setup
        /// </summary>
        /// <returns>
        /// Action of AutoMappingExpressions
        /// </returns>
        private Action<AutoMappingExpressions> GetSetup()
        {
            return c =>
                {
                    c.FindIdentity = type => type.Name == "Id";
                    c.IsBaseType = this.IsBaseTypeConvention;
                };
        }

        private  Action<IConventionFinder> GetConventions() 
        {
            return c =>
                { 
                    c.Add<PrimaryKeyConvention>();
                    c.Add<ReferenceConvention>();
                    c.Add<HasManyConvention>();
                    c.Add<TableNameConvention>();
                    c.Add<PropertyNameConvention>();
                };
        }

        public AutoPersistenceModel Generate()
        {
            var model =
                new AutoPersistenceModel()
                    .AddEntityAssembly(Assembly.GetAssembly(typeof(User)))
                    .Where(
                    this.GetAutoMappingFilter).Conventions.Setup(this.GetConventions()).Setup(this.GetSetup()).
                    UseOverridesFromAssemblyOf<AutoPersistenceModelGenerator>();
            return model;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...