(Fluent)NHibernate忽略了INamingStrategy?

时间:2010-06-04 11:04:31

标签: nhibernate fluent-nhibernate

我正在尝试为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);
}

通过在GetNHibernateConfiguration()中的return语句上放置断点,我能够确认nHibernateConfiguration.NamingStrategy包含对我的策略的引用。但是,在该策略的每个INamingStrategy实现成员中放置断点会显示其中没有断点被调用。通过查看生成的模式来确认这一点,该模式没有前缀。

同样,使用相同的方法创建会话工厂,表明CRUD操作也忽略了策略。

我错过了一些明显的东西?

我正在使用NHibernate 2.1.1.4000

1 个答案:

答案 0 :(得分:0)

我认为你的策略太复杂了。如果您使用FluentNHibertate,只需在初始化中提供TableName约定。

如参见:

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