2011-10-07 3 views
3

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

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

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

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

, какая версия FNH вы используете? Вызывает ли это соглашение для классов в Foo.dll и Bar.dll (см. Instance.Type)? – Firo

+0

FNH версия 1.2.0.712 и условность вызывается для всех отображений класса, но имена таблиц остаться один и тот же –

ответ

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) 

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

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

Используя первый образец, она перекрывает только имена таблиц, если они не определены в classmap. Если в таблице есть таблица («tablename»); ', то она не отменяется. Используя последний образец, он сначала записывает сопоставления в консоль и после этого вызывает это соглашение. Я думаю, почему-то FNH делает вещи в неправильном порядке. –

+1

значения используются как: отображение ?? конвенция ?? по умолчанию. поэтому в именах таблиц всегда предпочитаются условные обозначения. вы должны использовать переопределить или установить их с помощью 'config.GetClassMappings()' – Firo

+0

Возможно, я просто сделаю расширения, обеспечивающие сопоставления как XmlDocuments и использующие простой «NHibernate.Cfg.Configuration.AddDocument (XmlDocument doc)» –

0

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

return Fluently.Configure() 
       .Database(...) 
       .Mappings(m => 
        { 
         m.AutoMappings.Add(
          AutoMap.AssemblyOf<EntityMap>(new ImporterAutomappingConfiguration()) 
            .Conventions.Add<TableNameConvention>()); 
        }) 
       .BuildSessionFactory(); 
Смежные вопросы