流畅的NHibernate - 覆盖表名

时间:2011-10-07 15:22:45

标签: fluent-nhibernate

应用程序有许多扩展程序集,它们包含类的映射。我需要在这些映射中为所有(base,join,many-to-many,...)表名添加前缀。

E.g。

Assembly:        ~/bin/Extensions/Foo.dll
Original table:  Page
New table:       Ext_Foo_Page

Assembly:        ~/bin/Extensions/Bar.dll
Original table:  Page
New table:       Ext_Bar_Page

最简单的方法是什么?

我试过这个

public class TableNameConvention : IClassConvention, IJoinedSubclassConvention, IHasManyToManyConvention
{
    private string getPrefix()
    {
        return "Ext_Test_";
    }
    public void Apply(FluentNHibernate.Conventions.Instances.IClassInstance instance)
    {
        instance.Table(getPrefix() + instance.TableName);
    }

    public void Apply(FluentNHibernate.Conventions.Instances.IJoinedSubclassInstance instance)
    {
        instance.Table(getPrefix() + instance.TableName);
    }
    public void Apply(FluentNHibernate.Conventions.Instances.IManyToManyCollectionInstance instance)
    {
        instance.Table(getPrefix() + instance.TableName);
    }
}

但即使执行了这些方法,它也不会更改表名。

编辑 - 配置

var sb = new StringBuilder();
var sw = new StringWriter(sb);

var cfg = Fluently.Configure()
    .Database(MsSqlConfiguration.MsSql2008.ConnectionString(b => b.Server(@".\SQLEXPRESS").Database("test123").Username("sa").Password("...")))
    .Mappings(m => m.FluentMappings.AddFromAssembly(assembly).Conventions.Add<TableNameConvention>().ExportTo(sw))
    .ExposeConfiguration(c => { new SchemaUpdate(c).Execute(false, true); })
    .BuildSessionFactory();

var xml = sb.ToString();

2 个答案:

答案 0 :(得分:2)

与FNH 1.2.0.712

适用于

var model = new PersistenceModel();
model.Add(typeof(EntityMap));
model.Conventions.Add<TableNameConvention>();
model.WriteMappingsTo(Console.Out);

但不是

m.FluentMappings.Add(typeof(EntityMap)).Conventions.Add<TableNameConvention>().ExportTo(Console.Out)

在第二个例子中没有调用它,也许是bug。但以下作品

.Mappings(m => 
{
    m.AutoMappings.Add(() => new AutoPersistenceModel().Conventions.Add<TableNameConvention>());
    m.FluentMappings.Add(typeof(EntityMap)).ExportTo(Console.Out);
})

答案 1 :(得分:0)

以下语法适用于我:

return Fluently.Configure()
               .Database(...)
               .Mappings(m =>
                    {
                        m.AutoMappings.Add(
                            AutoMap.AssemblyOf<EntityMap>(new ImporterAutomappingConfiguration())
                                   .Conventions.Add<TableNameConvention>());
                    })
                .BuildSessionFactory();