如何配置NHibernate(或Fluent NHib)为所有表名添加表名前缀?

时间:2009-10-05 15:11:46

标签: nhibernate orm fluent-nhibernate naming-conventions

在我正在开发的当前应用程序中,我正在使用Fluent NHibernate来配置NHibernate以用作ORM。我希望能够为应用程序中使用的所有表名添加前缀,这样,如果我使用的数据库已经在为另一个应用程序提供服务,则两个应用程序之间不存在命名冲突。

例如,如果我想为每个表添加Portal_前缀,Users表将变为Portal_Users

当然,我知道如何在每个映射文件中配置每个表名,但这对我正在尝试做的事情来说并不是一个很好的解决方案。如果我想更改前缀,我将被迫更改每个映射文件。我希望能够在我的代码或配置中的单个位置为所有表名添加(或更改)前缀。

如何使用NHibernate(或Fluent NHibernate)为应用程序中的所有表名添加前缀?

2 个答案:

答案 0 :(得分:3)

您可以实施自己的INamingStrategy并为您的配置指定:

Configuration config = new Configuration();
config.SetNamingStrategy(new MyTablePrefixStrategy());

答案 1 :(得分:2)

为了流利的实施..

 public class AutoPersistenceModelGenerator : IAutoPersistenceModelGenerator
    {
        public AutoPersistenceModel Generate()
        {
            var mappings = new AutoPersistenceModel();
            mappings.AddEntityAssembly(typeof(User).Assembly).Where(GetAutoMappingFilter);
            mappings.Conventions.Setup(GetConventions());

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

...

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