C# Fluent NHibernate-从映射中重写表名

C# Fluent NHibernate-从映射中重写表名,c#,nhibernate,fluent-nhibernate,fluent,fluent-nhibernate-mapping,C#,Nhibernate,Fluent Nhibernate,Fluent,Fluent Nhibernate Mapping,我正在使用Fluent NHibernate映射我的NHibernate模型 现在我遇到了一个问题,在某些情况下,我想在所有表的前面加一个下划线。因此,我不能仅仅更改映射中的表(…)定义,我必须从外部进行更改 到目前为止,我得到的是: 型号: class Foo { public virtual int Id { get; set; } } class FooMapping : ClassMap<Foo> { Table("foo_table"); Id(

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

现在我遇到了一个问题,在某些情况下,我想在所有表的前面加一个下划线。因此,我不能仅仅更改映射中的
表(…)
定义,我必须从外部进行更改

到目前为止,我得到的是:

型号:

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

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

    Id(x => x.Id).Column("foo_id");
}
这总是显示“foo_table”而不是“foo_table”

当我注释掉
表(…)
定义时,它就像一个符咒。。。但是我需要在映射中设置
表(…)

,只要您定义

Table("foo_table");
您必须更新所有这些位置,并在其中添加前缀。最好使用一个定义在某个地方的常量值,如果你必须再次更改它,那么它都在一个地方

public const string TABLE_PREFIX = "_";
然后使用它

Table(TABLE_PREFIX + "foo_table");

要轻松重构,只需在所有文件中搜索
表(“
并将其替换为
表(表前缀+”
)。

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

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);
        }
    }
}
使用FluentNHibernate.Conventions;
使用FluentNHibernate.Conventions.Instances;
使用FluentNHibernate.Conventions.Acceptance标准;
使用FluentNHibernate.Conventions.Inspection;
名称空间MyDatabaseProject.Conventions
{
公共类UnderlineTableName约定:IClassConvention
{
公共无效接受(IAcceptanceCriteria标准)
{
}
公共无效应用(IClassInstance实例)
{
instance.Table(“\u”+instance.TableName);
}
}
}
然后,您需要使用以下内容构建会话工厂:

sessionFactory = Fluently.Configure(normalConfig)
                  .Mappings(m =>
                      m.FluentMappings
                      .AddFromAssemblyOf<OrderMap>()
                      .Conventions.AddFromAssemblyOf<UnderscoreTableNameConvention>())
                      .ProxyFactoryFactory("NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate")
                  .BuildSessionFactory();
sessionFactory=fluntly.Configure(normalConfig)
.Mappings(m=>
m、 FluentMappings
.AddFromAssemblyOf()的
.Conventions.AddFromAssemblyOf())
.proxyFactory(“NHibernate.Bytecode.defaultproxyFactory,NHibernate”)
.BuildSessionFactory();

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

上述答案给了我一个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();
sessionFactory=fluntly.Configure(normalConfig)
.Mappings(m=>
m、 FluentMappings
.AddFromAssemblyOf()的
.Conventions.AddFromAssemblyOf())
.proxyFactory(“NHibernate.Bytecode.defaultproxyFactory,NHibernate”)
.BuildSessionFactory();

如果您只想对某些表执行此操作,则可能必须对每个表显式执行此操作。如果您使用自动映射,则还需要为此执行手动映射。请参阅此处的“混合流畅映射和自动映射”部分:这不是一个好主意,但是否可以选择像表一样进行映射(UtilityClass.GetTableName(“foo_table”)),其中UtilityClass将依赖某些配置/上下文变量以下划线作为tableName的前缀?这是一个非常老的问题……您找到解决方案了吗(3年前:D)?
sessionFactory = Fluently.Configure(normalConfig)
                  .Mappings(m =>
                      m.FluentMappings
                      .AddFromAssemblyOf<OrderMap>()
                      .Conventions.AddFromAssemblyOf<UnderscoreTableNameConvention>())
                      .ProxyFactoryFactory("NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate")
                  .BuildSessionFactory();