如何从nhibernate元数据获取表依赖关系?

如何从nhibernate元数据获取表依赖关系?,nhibernate,Nhibernate,我有一个相当大和复杂的NHibernate应用程序。我将不告诉您原因的详细信息,但我们有自定义表跟踪系统中的实体、它们的支持表名称和依赖顺序。这用于各种数据发布后处理,依赖关系顺序是了解如何批量发布数据的关键 如今,这些表格是手工维护的,这变得非常难以维护。我正在寻找一种自动为这些表设定种子的方法。ISessionFactoryImplementor.GetAllClassMetadata提供了大量丰富的信息。我相信我可以编写一个函数来解释一个属性一个属性、一个关联一个关联、一个集合一个集合的方

我有一个相当大和复杂的NHibernate应用程序。我将不告诉您原因的详细信息,但我们有自定义表跟踪系统中的实体、它们的支持表名称和依赖顺序。这用于各种数据发布后处理,依赖关系顺序是了解如何批量发布数据的关键

如今,这些表格是手工维护的,这变得非常难以维护。我正在寻找一种自动为这些表设定种子的方法。ISessionFactoryImplementor.GetAllClassMetadata提供了大量丰富的信息。我相信我可以编写一个函数来解释一个属性一个属性、一个关联一个关联、一个集合一个集合的方式,但我希望在NHibernate中找到一些已经烘焙过的东西。NHibernate显然有这种内在的智慧


提前感谢

您想要的所有信息都是配置数据、表、列、FKs PKs等,对吗

这可以在会话工厂初始化期间生成的配置对象中找到

如果使用FluentNHibernate,则可以从Fluently返回配置对象。Configure…ExposeConfigurationcfg=>。。。例如

此对象包含有关所有映射类的所有信息。ClassMappings和collections。CollectionMappings。在每个映射中都有一个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实现所使用的方法


这应该足以让您找出依赖项并对表列表进行排序,例如…

您是对的,这是所有配置,当然NH在配置和SessionFactory对象中可能包含的信息。但是,请注意,SchemaExport总是在处理完所有表之后创建/删除FK,从而避免了这个问题。所以那个代码对我没什么帮助。我相信我可以在几个小时内完成这项工作,但我真的在寻找一个现成的排序函数,它已经在做这项工作了。仔细看,FK上的ReferencedTable应该会让这项工作变得微不足道。这将比会话工厂中的IClassMetadata工作得更好。谢谢