Fluent nhibernate Fluent NHibernate-重写表名

Fluent nhibernate Fluent NHibernate-重写表名,fluent-nhibernate,Fluent Nhibernate,应用程序有许多扩展程序集,它们包含其类的映射。我需要为这些映射中的所有(基、联接、多对多…)表名添加前缀 例如 最直接的方法是什么 我试过这个 public class TableNameConvention : IClassConvention, IJoinedSubclassConvention, IHasManyToManyConvention { private string getPrefix() { return "Ext_Test_"; }

应用程序有许多扩展程序集,它们包含其类的映射。我需要为这些映射中的所有(基、联接、多对多…)表名添加前缀

例如

最直接的方法是什么

我试过这个

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();
var sb=new StringBuilder();
var sw=新的StringWriter(sb);
var cfg=fluntly.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(b=>b.Server(@“.\SQLEXPRESS”).Database(“test123”).Username(“sa”).Password(“…”))
.Mappings(m=>m.FluentMappings.AddFromAssembly(assembly).Conventions.Add().ExportTo(sw))
.ExposeConfiguration(c=>{newschemaUpdate(c).Execute(false,true);})
.BuildSessionFactory();
var xml=sb.ToString();
带有FNH 1.2.0.712

它与

var model = new PersistenceModel();
model.Add(typeof(EntityMap));
model.Conventions.Add<TableNameConvention>();
model.WriteMappingsTo(Console.Out);
var model=newpersistencemodel();
model.Add(typeof(EntityMap));
model.Conventions.Add();
model.WriteMappingsTo(Console.Out);
但不是用

m.FluentMappings.Add(typeof(EntityMap)).Conventions.Add<TableNameConvention>().ExportTo(Console.Out)
m.FluentMappings.Add(typeof(EntityMap)).Conventions.Add().ExportTo(Console.Out)
在第二个示例中没有调用它,可能是bug。但是下面的工作

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

以下语法适用于我:

return Fluently.Configure()
               .Database(...)
               .Mappings(m =>
                    {
                        m.AutoMappings.Add(
                            AutoMap.AssemblyOf<EntityMap>(new ImporterAutomappingConfiguration())
                                   .Conventions.Add<TableNameConvention>());
                    })
                .BuildSessionFactory();
流畅地返回。Configure()
.数据库(…)
.Mappings(m=>
{
m、 自动映射。添加(
AutoMap.AssemblyOf(新的ImporterAutomappingConfiguration())
.Conventions.Add());
})
.BuildSessionFactory();

您使用哪个版本的FNH?它是否为Foo.dll和Bar.dll中的类调用约定(请参见instance.Type)?FNH版本为1.2.0.712,所有类映射都调用约定,但表名保持不变。在第一个示例中,它仅在类映射中未定义表名时才重写表名。如果有
表(“表名”)在映射中,则它不会覆盖。使用最后一个示例,它首先将映射写入控制台,然后调用该约定。我猜出于某种原因,FNH的操作顺序是错误的??惯例??违约因此,映射中的表名总是优于约定。您必须使用override或使用
config.GetClassMappings()
设置它们,也许我会让扩展以XmlDocuments的形式提供映射,并使用plain
NHibernate.Cfg.Configuration.AddDocument(XmlDocument doc)
或在添加fluent映射之后执行
config.GetClassMappings().Where(m=>IsExtension(m.Type.Assembly)).ForEach(m=>m.Table.Name=“ext\ux”+m.Table.Name)
return Fluently.Configure()
               .Database(...)
               .Mappings(m =>
                    {
                        m.AutoMappings.Add(
                            AutoMap.AssemblyOf<EntityMap>(new ImporterAutomappingConfiguration())
                                   .Conventions.Add<TableNameConvention>());
                    })
                .BuildSessionFactory();