我有一个相当大而复杂的NHibernate应用程序。我将为您提供原因的详细信息,但我们有自定义表来跟踪系统中的实体,它们的支持表名称和依赖顺序(想想简化的sys.tables)。这用于各种数据发布后处理,依赖顺序是知道如何批量发布数据的关键。
今天,这些表格是手工维护的,这些表格变得非常难以维护。我正在寻找一种自动播种这些表格的方法。 ISessionFactoryImplementor.GetAllClassMetadata()
提供了大量丰富的信息。我确信我可以通过属性,关联关联和收集方式的集合来编写一个函数来解释这个属性,但我希望能找到NHibernate中已经出现的东西。 NHibernate显然拥有这种智能。
提前致谢
答案 0 :(得分:0)
您想要的所有信息是我认为只是配置数据,表格,列,FKs PK等吗?
这可以在会话工厂初始化期间构建的配置对象中找到。
如果您使用FluentNHibernate,则可以从Fluently.Configure()...ExposeConfiguration(cfg => ...)
返回配置对象,例如......
此对象包含有关所有映射类.ClassMappings
和集合.CollectionMappings
的所有信息。在每个映射中,您都有一个类型为Table
的属性NHibernate.Mapping.Table
,其中包含所有与数据库相关的信息,如列,引用等...
让我们有一个小例子,用列和FK打印所有表名
foreach (var clazz in cfg.ClassMappings)
{
Table table = clazz.Table;
Console.WriteLine("Tablename: " + table.Name + " - Columns: " + string.Join(", ", table.ColumnIterator.Select(p => p.Name)));
foreach (var uid in table.UniqueKeyIterator)
{
Console.WriteLine("UniqueKey: " + string.Join(", ", uid.Columns.Select(p=>p.Name)));
}
foreach (var fk in table.ForeignKeyIterator)
{
Console.WriteLine("FKs: " + string.Join(", ", fk.Columns.Select(p => p.Name)) + " - to table " + fk.ReferencedTable.Name);
}
}
如果您想查看有关如何使用它的更多详细信息,那么如果您查看Configuration.GenerateSchemaCreationScript
实现所使用的SchemaExport
方法的代码,那么这是一个很好的起点。
这应该足以让你找出依赖关系并订购表格列表,例如......