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