Свободный NHibernate - переопределить имена таблиц - PullRequest
3 голосов
/ 07 октября 2011

Приложение имеет множество сборок расширений, и они содержат сопоставления для своих классов.Мне нужно добавить префикс для всех (base, join, many-to-many, ...) имен таблиц в этих сопоставлениях.

Например

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

, но он не меняет имена таблиц, даже если эти методы выполняются.

EDIT - конфигурация

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 ]

2 голосов
/ 10 октября 2011

с 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)

во втором примере это не вызывается, возможно, ошибка.но следующие работы

.Mappings(m => 
{
    m.AutoMappings.Add(() => new AutoPersistenceModel().Conventions.Add<TableNameConvention>());
    m.FluentMappings.Add(typeof(EntityMap)).ExportTo(Console.Out);
})
0 голосов
/ 03 апреля 2013

У меня работает следующий синтаксис:

return Fluently.Configure()
               .Database(...)
               .Mappings(m =>
                    {
                        m.AutoMappings.Add(
                            AutoMap.AssemblyOf<EntityMap>(new ImporterAutomappingConfiguration())
                                   .Conventions.Add<TableNameConvention>());
                    })
                .BuildSessionFactory();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...