3

我正在使用 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(...)在映射中设置集合。

4

3 回答 3

0

只要你定义

Table("foo_table");

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

public const string TABLE_PREFIX = "_";

然后使用它

Table(TABLE_PREFIX + "foo_table");

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

于 2013-10-12T08:21:21.113 回答
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 构建会话工厂后对映射的任何更改都需要您使用所需的新表映射重建会话工厂。

于 2013-10-14T11:58:41.663 回答
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();
于 2016-01-25T08:43:05.950 回答