开发者

Fluent NHibernate - override table names

开发者 https://www.devze.com 2023-04-12 00:33 出处:网络
Application has many extension assemblies and they contain mappings for their classes. I need to add prefix to all (base, join, many-to-many, ...) table names in those mappings.

Application has many extension assemblies and they contain mappings for their classes. I need to add prefix to all (base, join, many-to-many, ...) table names in those mappings.

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

What's the most straightforward way to do that?

I tried this

public class TableNameConvention : IClassConvention, IJoinedSubclassConvention, IHasManyToManyConvention
{
    private string getPrefix()
    {
        return "Ext_Test_";
    }
    public void Apply(FluentNHibernate.C开发者_JS百科onventions.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);
    }
}

but it doesn't change table names even though those methods are executed.

EDIT - The configuration

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();


with FNH 1.2.0.712

it works with

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

but not with

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

it's not called in the second example, maybe bug. but the following works

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


The following syntax works for me:

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

精彩评论

暂无评论...
验证码 换一张
取 消