如何从nhibernate元数据中获取表依赖项?

时间:2014-01-01 01:58:04

标签: nhibernate

我有一个相当大而复杂的NHibernate应用程序。我将为您提供原因的详细信息,但我们有自定义表来跟踪系统中的实体,它们的支持表名称和依赖顺序(想想简化的sys.tables)。这用于各种数据发布后处理,依赖顺序是知道如何批量发布数据的关键。

今天,这些表格是手工维护的,这些表格变得非常难以维护。我正在寻找一种自动播种这些表格的方法。 ISessionFactoryImplementor.GetAllClassMetadata()提供了大量丰富的信息。我确信我可以通过属性,关联关联和收集方式的集合来编写一个函数来解释这个属性,但我希望能找到NHibernate中已经出现的东西。 NHibernate显然拥有这种智能。

提前致谢

1 个答案:

答案 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方法的代码,那么这是一个很好的起点。

这应该足以让你找出依赖关系并订购表格列表,例如......