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的形式提供映射,并使用plainNHibernate.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();