2011-10-07 78 views
3

應用程序有許多擴展程序集,它們包含其類的映射。我需要在這些映射中爲所有(基本,連接,多對多...)表名添加前綴。流利的NHibernate - 覆蓋表名

例如

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

它不是在第二稱爲配置例如,也許不G。但下面的工作

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

使用第一個示例時,如果它們未在類映射中定義,它將僅覆蓋表名。如果映射中有'Table(「tablename」);',那麼它不會覆蓋。使用最後一個示例,它首先將映射寫入控制檯,然後調用該約定。我猜因爲某些原因,FNH以錯誤的順序做事。 –

+1

值的使用方式如下所示:映射慣例 ??默認。所以映射中的表名總是優先於約定。你必須使用覆蓋或設置它們與'config.GetClassMappings()' – Firo

+0

也許我只會使擴展提供映射爲XmlDocuments和使用普通'NHibernate.Cfg.Configuration.AddDocument(XmlDocument文檔)' –

0

以下語法對我的作品:

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