2011-10-07 21 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();