Fluent NHibernate - 覆盖映射中的表名

时间:2013-10-11 11:58:45

标签: c# nhibernate fluent-nhibernate fluent fluent-nhibernate-mapping

我正在使用Fluent NHibernate来映射我的NHibernate模型。

现在我遇到了问题,我希望在我的所有表格前面加上下划线,在某些情况下。所以我不能只改变映射中的Table(...)定义,我必须从外部进行。

到目前为止我得到了什么:

型号:

class Foo
{
    public virtual int Id { get; set; }
}

class FooMapping : ClassMap<Foo>
{
    Table("foo_table");

    Id(x => x.Id).Column("foo_id");
}

我控制器的某个地方:

/*...*/
if (yourehappyandyouknowit)
{
    Fluently.Configure()
    /*...*/
        .Conventions.Add(Table.Is(x => "_" + x.TableName));
    /*...*/
}

这总是输出“foo_table”而不是“_foo_table”。

当我注释掉Table(...)定义时,它就像魅力一样...但我需要在映射中设置Table(...)

3 个答案:

答案 0 :(得分:0)

只要你定义

Table("foo_table");

您必须更新所有这些地方并为其添加前缀。最好使用一个定义的常量值,如果你必须再次更改它,它就在一个地方...

public const string TABLE_PREFIX = "_";

然后使用它

Table(TABLE_PREFIX + "foo_table");

轻松重构,只需搜索Table("并在所有文件中将其替换为Table(TABLE_PREFIX + " ...

答案 1 :(得分:0)

您可以尝试使用以下约定:

using FluentNHibernate.Conventions;
using FluentNHibernate.Conventions.Instances;
using FluentNHibernate.Conventions.AcceptanceCriteria;
using FluentNHibernate.Conventions.Inspections;

namespace MyDatabaseProject.Conventions
{
    public class UnderscoreTableNameConvention : IClassConvention
    {
        public void Accept(IAcceptanceCriteria<IClassInspector> criteria)
        {

        }
        public void Apply(IClassInstance instance)
        {
            instance.Table("_" + instance.TableName);
        }
    }
}

然后你需要用这样的东西构建会话工厂:

sessionFactory = Fluently.Configure(normalConfig)
                  .Mappings(m =>
                      m.FluentMappings
                      .AddFromAssemblyOf<OrderMap>()
                      .Conventions.AddFromAssemblyOf<UnderscoreTableNameConvention>())
                      .ProxyFactoryFactory("NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate")
                  .BuildSessionFactory();

通过Fluent NHibernate构建会话工厂后对映射的任何更改都需要使用所需的新表映射重建会话工厂。

答案 2 :(得分:0)

上面的答案给了我一个sql server错误,因为表名周围有“`”。它们也不包括所有类型的映射,例如子类和集合。

这对我有用:

using FluentNHibernate.Conventions;
using FluentNHibernate.Conventions.AcceptanceCriteria;
using FluentNHibernate.Conventions.Inspections;
using FluentNHibernate.Conventions.Instances;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestingNhibernate
{
    public class UnderscoreTableNameConvention : IClassConvention, IJoinedSubclassConvention,  ICollectionConvention
    {
        public readonly string PrependToTableName = "_"; 

        public void Apply(IClassInstance instance)
        {
            instance.Table(GetTableName(instance.EntityType.Name));
        }

        public void Apply(IJoinedSubclassInstance instance)
        {
            instance.Table(GetTableName(instance.EntityType.Name));
        }

        public void Apply(ICollectionInstance instance)
        {
            instance.Table(GetTableName(instance.EntityType.Name));
        }

        private string GetTableName(string originalName)
        {
            return string.Format("`{0}{1}`", PrependToTableName, originalName);
        }
    }
}

与@ [Cole W]提到的一样,您需要使用约定构建sessionFactory:

sessionFactory = Fluently.Configure(normalConfig)
                  .Mappings(m =>
                      m.FluentMappings
                      .AddFromAssemblyOf<OrderMap>()
                      .Conventions.AddFromAssemblyOf<UnderscoreTableNameConvention>())
                      .ProxyFactoryFactory("NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate")
                  .BuildSessionFactory();