.net NHibernate表的映射表

.net NHibernate表的映射表,.net,fluent-nhibernate,.net,Fluent Nhibernate,我试图将NHibernate包装成一个不是我创建的遗留数据库。它有一个我最能描述的表格表,叫做table_DETAIL。它看起来像这样: COLUMN_NAME | TABLE_VALUE | TABLE_DESC -------------+-----------------+--------------------------------- state | CA | California state | NY

我试图将NHibernate包装成一个不是我创建的遗留数据库。它有一个我最能描述的表格表,叫做table_DETAIL。它看起来像这样:

COLUMN_NAME  |  TABLE_VALUE    |  TABLE_DESC
-------------+-----------------+---------------------------------
state        |  CA             |  California
state        |  NY             |  New York
...
country      |  US             |  United States
country      |  CA             |  Canada
我试图使用Fluent NHibernate和表每类层次结构策略来映射这一点。换句话说,我有一个TableDetail类,以及State和Country的子类。我使用列名作为鉴别器

TableDetailMap.cs:

当我尝试将State字段映射到State类时,问题就出现了。地址\记录中的状态列引用表\详细信息主键的一半-表\值部分。列名部分是state-因为它是鉴别器,所以我希望应该提供它。但NHibernate不这么认为,并抛出了这个例外:

Foreign key (FK3D33E87CA66E339C:ADDRESS_RECORD [STATE])) must have same number of columns as the referenced primary key (TABLE_DETAIL [TABLE_VALUE, COLUMN_NAME])
我如何映射它,使NHibernate知道自动提供state作为复合键后半部分的值


如果我能提供更多信息,请让我知道。

我想出了一个一般的解决方案。在基类map TableDetailMap.cs中,我指定了鉴别器,我指定了always select with value,如下所示:

public class TableDetailMap : ClassMap<TableDetail>
{
  public TableDetailMap()
  {
    ...snip...

    DiscriminateSubClassesOnColumn("COLUMN_NAME").AlwaysSelectWithValue();
  }
}
public class AddressRecordMap : ClassMap<AddressRecord>
{
  public AddressRecordMap()
  {
    ...snip...

    References(x => x.State)
      .Column("STATE")
      .Fetch.Select();

    ...snip...
  }
}
然后,在所有使用TableDetail对象的映射类中,我必须指定在获取时使用select,如下所示:

public class TableDetailMap : ClassMap<TableDetail>
{
  public TableDetailMap()
  {
    ...snip...

    DiscriminateSubClassesOnColumn("COLUMN_NAME").AlwaysSelectWithValue();
  }
}
public class AddressRecordMap : ClassMap<AddressRecord>
{
  public AddressRecordMap()
  {
    ...snip...

    References(x => x.State)
      .Column("STATE")
      .Fetch.Select();

    ...snip...
  }
}
在我将其中一个对象用作复合ID的一部分的情况下,这仍然不起作用。我不确定如何修复它,但我现在能够解决它

public class AddressRecordMap : ClassMap<AddressRecord>
{
  public AddressRecordMap()
  {
    ...snip...

    References(x => x.State)
      .Column("STATE")
      .Fetch.Select();

    ...snip...
  }
}