具有自然键的Fluent NHibernate引用实体

具有自然键的Fluent NHibernate引用实体,nhibernate,orm,fluent-nhibernate,automapping,natural-key,Nhibernate,Orm,Fluent Nhibernate,Automapping,Natural Key,我正在使用Fluent NHibernate自动映射功能。我已经设法使用约定使数据库映射非常接近,但是有一些事情需要IAutoMappingOverride 在遗留系统中,我有一个实体类“Campus”,它有一个自然键“Code”。此密钥的Oracle数据库类型为VARCHAR23字节。我正在对此使用覆盖,因为我的约定将假定一个自动生成的代理键。我还有其他实体类,例如使用其自然键引用校园实体的Building,如下所示 <class name="Campus" table="CAMPUS"

我正在使用Fluent NHibernate自动映射功能。我已经设法使用约定使数据库映射非常接近,但是有一些事情需要IAutoMappingOverride

在遗留系统中,我有一个实体类“Campus”,它有一个自然键“Code”。此密钥的Oracle数据库类型为VARCHAR23字节。我正在对此使用覆盖,因为我的约定将假定一个自动生成的代理键。我还有其他实体类,例如使用其自然键引用校园实体的Building,如下所示

<class name="Campus" table="CAMPUS" ... >
<id name="Id" type="String">
  <column name="camp_code" sql-type="VARCHAR2(3 BYTE)" />
  <generator class="assigned" />
</id>
<set name="Buildings" ...>
  <key foreign-key="buil_camp_fk">
    <column name="camp_code" />
  </key>
  <one-to-many class="Building" />
</set>
...
</class>

<class name="Building" table="BUILDING" ... >
...
<many-to-one class="Campus" name="Campus">
<column name="camp_code" not-null="true" />
</many-to-one>
...
</class>
但是,架构导出Oracle数据库不正确

create table BUILDING (
   ...
   camp_code NVARCHAR2(255) not null,
   ...
)
create table CAMPUS (
   camp_code VARCHAR2(3 BYTE) not null,
   ...
   primary key (camp_code)
)
正如您所看到的building.camp_代码是NVARCHAR2255,这似乎是Oracle中字符串的默认值,但它应该是VARCHAR23字节

我看到有一个mapping.NaturalId函数,但我不确定它是否正常工作,因为如果我用它代替Id,我会得到一个映射异常

如果您能帮助我处理这种情况,我将不胜感激

亲切问候,,
Ryan。

我同意您的看法,FNH应该将关联另一端的列类型识别为VARCHAR,但显然不是。也许值得在家里四处打听一下


但为了解决您当前的问题,我认为在您的建筑映射覆盖中,您可以指定要使用的柱的确切类型,使用柱函数,以便您可以自己更正该行为。

感谢您的回复。我来看看FNH的邮件列表。干杯我不认为我可以使用ManyToOneBuilderOf TOther的Column函数来做我需要的事情,因为这只是设置了我已经正确设置的列名。对于TOther的许多OneBuilder,没有自定义SQLType函数。我注意到其他人也提出了类似的问题。
create table BUILDING (
   ...
   camp_code NVARCHAR2(255) not null,
   ...
)
create table CAMPUS (
   camp_code VARCHAR2(3 BYTE) not null,
   ...
   primary key (camp_code)
)