NHibernate映射与来自多个来源的许多人的一对多关系

时间:2011-02-04 17:55:02

标签: .net nhibernate fluent-nhibernate

背景

我一直在研究一种应该与遗留应用程序配合使用的工具,而且我已经打了一个小砖墙。我花了最后一天左右的时间寻找线索,但我没有运气。

我正在尝试映射表和多个其他表之间的关系,如下所示:

父表表示“字典”。此字典是可以在(可怕的)遗留应用程序中的ad-hoc记录查询中使用的所有数据库字段的列表。每条记录包含可以找到项目的表和列,唯一标识“友好”名称,用于全局值查找表的键,以及确定如何提取这些查找值的标志,以及定义的文本列如果正确设置标志值,则运行SQL以获取查找数据。表名是[字典](表格结构如下所示。)

该标志可以有四个值之一:

  • FREEFORM
  • STANDARD
  • SYSTEM
  • DYNAMIC

如果该标志设置为FREEFORM,则最终用户可以输入他们想要的任何值。如果是任何其他值,则必须从列表中选择一个值,如下所示:

  1. STANDARD :遗留应用程序从两个表的“union all”查询中提取所有值,这两个表的唯一区别在于一个表是基于财务年度的,另一个是“全局”值表。这些表包含所有“STANDARD”标记字典记录的所有查找值。这两个表分别称为[fy_lookup_values]和[lookup_values](参见下面的表结构)
  2. SYSTEM :如果字典表中的友好名称是“state”,它会拉出[state]表中所有状态的列表;如果是国家,则对[country]表执行相同的操作(参见下面的表格结构)
  3. DYNAMIC :根据上面在字典表中描述的动态SQL字段中的查询填充查找值。这些查询不会为所选列添加别名,其名称甚至类似于上面其他两种查找类型的列名。我将提供下面这些查询中使用的众多表之一的示例。
  4. 表格结构

    Table [dictionary]
        token int not null identity primary key
        name varchar(10) not null
        table_name varchar(50) not null
        column_name varchar(30) not null
        lookup_key varchar(10) not null
        lookup_type varchar(8) not null
        query_text text
    
    Table [lookup_values]
        lookup_key varchar(10) not null primary key
        lookup_value varchar(20) not null primary key
        lookup_description text not null
    
    Table [fy_lookup_values]
        lookup_key varchar(10) not null primary key
        lookup_value varchar(20) not null primary key
        lookup_description text not null
        fy_year_token int not null
    
    Table [state]
        state_code varchar(4) not null primary key
        state_name varchar(30) not null
    
    Table [country]
        country_code varchar(4) not null primary key
        country_name varchar(50) not null
    
    Table [banks]
        bank_token int not null identity primary key
        bank_name varchar(50) not null
    

    应用程序中的所有查找值retreivals都会抓取两列,一个代码和一个描述。遗留应用程序当前根据列位置而不是名称来按摩所有传入数据。

    我无法触及数据库结构(甚至是添加存储过程),也无法改变查找的完成方式,因为这些都被一些遗留应用程序使用,任何更改都会使管理层非常不满意......我我希望能,因为这只是许多事情中的一个,使得我的头发在这个应用中变得灰白。所以......

    我想,我的主要问题是,是否可以使用NHibernate以这种方式映射这些问题,这样当我抓取一个字典项时,它的查找值会为我填写?如果有可能,怎么样?我知道如果所有查找都以相同的方式完成,我可以,但我甚至不知道是否可以根据外部获得的查询进行映射。

    我希望这是有道理的,因为我需要一段时间才能将我的大脑包裹起来。

    修改 以下是我想要完成的一些例子。

    我们在[字典]表中有以下记录:

    token, name     , table_name, column_name, lookup_key, lookup_type, query_text
    1    , gender   , customer  , gender     , gender    , STANDARD   , NULL
    2    , addr_st  , customer  , addr_st    , state     , SYSTEM     , NULL
    3    , acct_type, cust_accts, type_code  , acct_type , DYNAMIC    , select type_code, descr from acct_types where active = 1
    

    因此,在遗留应用程序中,当它们被拉起时,这是执行以提取查找值的SQL。

    性别:

    select lookup_value,
           lookup_description
    from   lookup_values
    union all
    select lookup_value,
           lookup_description
    from   lookup_values
    where  fy_year_token = @P1
    

    地址状态:

    select state_code,
           state_name
    from   state
    

    帐户类型:

    select type_code,
           descr
    from   acct_types
    where  active = 1
    

1 个答案:

答案 0 :(得分:0)

您可以通过使用子类策略来实现此目的。因此,您的查找可以从名为Lookup的抽象类继承,您可以使用table per concrete class strategy进行映射。然后,您的字典对象可以使用适当的密钥创建一组Lookup。

由于您的复杂提取策略,您可能需要为每个查找实现某种custom loader。需要注意的是,此加载程序仅用于加载提取。如果要针对这些查找编写HQL或条件查询,它将违反表和映射。但是,希望你不需要这样做。