我是NHibernate的新手,我正在尝试创建一个映射文件来扩展数据模型项目。我映射的特定表在下图中称为AttributeDef,ControlType列实际上与名为Code的表中的查找有关(是的,我知道 - 应该有一个FK约束但是这种事情在这个项目中很常见所以请忽略明显的咆哮者并关注这个问题)。在大多数情况下,引用Code的表也有一个包含CodeSet表中ID的列,因为Code中的键几乎不可避免地是一个复合键,但在这种情况下并不是因为原作者认为“嘿他们都是全部从相同的代码集那么重要的是什么?“。
现在,如果AttributeDef中有一个包含CodeSet值的列,那么映射不会有太大问题。 Code实体的映射如下所示:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="Activus.DataModel" namespace="Activus.DataModel">
<class name="Code" table="Code" mutable="false">
<composite-id name="CompositeCodeId" class="CompositeCodeId">
<key-property name="CodeId" column="CodeId"/>
<key-property name="CodeSet" column="CodeSet"/>
</composite-id>
<property name="Description" column="Description" type="string" length="100" not-null="true"/>
<property name="ExternalRef" column ="ExternalRef" type ="string" length ="256" not-null ="true"/>
<property name="InternalRef" column ="InternalRef" type ="string" not-null ="false"/>
<many-to-one name="CodeSet" class="CodeSet" column="CodeSet" not-null="true" insert="false" update="false"/>
</class>
</hibernate-mapping>
因此,如果在AttributeDef中有一个CodeSet值的列(在本例中名义上称为FormControlCodeSet),那么在我的AttributeDef映射文件中,我将包括
<many-to-one name="ControlType" class="Code" not-null="false">
<column name="ControlType" />
<column name="FormControlCodeSet" />
</many-to-one>
一切都应该好。问题是,将该列添加到AttributeDef会非常具有侵入性,因为我必须进行大量其他更改以适应这一点,这会增加我所做的更改的风险因素,这可能是不可接受的(从客户的角度来看,他们的时间框架)。
所以,考虑到这是一个可怕的,可怕的事情,是否有可能替换这条线
<column name="FormControlCodeSet" />
用(耳语)硬编码值?这个价值在十年内没有改变,并且不太可能很快发生,但它会让我们超越这一变化,并强调需要确定范围并实施额外列的包含。我知道这是多么可怕但不幸的是很多这个数据库并不是真的非常适合ORM,尽管它无论如何都是鞋子角。
答案 0 :(得分:2)
与NHiberante合作时,您无需耳语。因为与遗留DB (即固定数据库模式)的合作非常标准,所以NHibernate确实支持许多不同的设置。
其中一个是(替代)设置:"column"
vs "formula"
。第一个采用列,第二个采用我们需要的 。取列,列,传递常数。所以:
<many-to-one name="ControlType" class="Code" not-null="false">
<column name="ControlType" />
<!-- let's replace this -->
<!--<column name="FormControlCodeSet" />-->
<!-- 1) with a constant number 123-->
<formula>123</formula>
<!-- 2) with a constant string 'constantString' -->
<formula>'constantString'</formula>
</many-to-one>
不确定FormControlCodeSet
常量应该是int
还是string
,但如上所示,任何一个选项都可以。