gpt4 book ai didi

nhibernate - Nhibernate 映射文件中的硬编码值

转载 作者:行者123 更新时间:2023-12-02 01:53:58 25 4
gpt4 key购买 nike

我是 NHibernate 的新手,我正在尝试创建一个映射文件来扩展数据模型项目。我正在映射的特定表在下图中称为 AttributeDef,ControlType 列实际上与名为 Code 的表中的查找相关(是的,我知道 - 应该有一个 FK 约束,但这种事情在这个项目中很常见所以请忽略明显的咆哮并专注于问题)。在大多数情况下,引用 Code 的表也有一个包含表 CodeSet 中的 ID 的列,因为 Code 中的键几乎不可避免地是一个复合键,但在这种情况下不是,大概是因为原作者认为“嘿,他们都是来自相同的代码集,那有什么意义呢?”。

Table structure relating to problem

现在,如果 AttributeDef 中有一列包含 CodeSet 值,那么映射就不是什么大问题了。代码实体的映射如下所示:

<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 将是非常具有侵入性的,因为我将不得不进行很多其他更改以适应这一点,这会增加我所做更改的风险因素,这很可能是 Not Acceptable (从客户的角度来看,给定他们的时间范围)。

所以,考虑到这是一件非常可怕的事情,是否有可能替换这条线

<column name="FormControlCodeSet" />

有一个(悄悄话)硬编码值?该值在十年内没有改变,而且不太可能很快改变,但它会让我们克服这一变化,并强调需要扩大范围并实现包含额外的列。我知道这是多么可怕,但不幸的是,这个数据库中的很多内容并不是真的那么适合 ORM,尽管它在各方面都被硬塞了。

最佳答案

使用 NHiberante 时,您不必耳语要求。因为与遗留数据库 (即固定数据库架构) 的合作非常标准,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,但如上所示,任何一个选项都是可能的。

关于nhibernate - Nhibernate 映射文件中的硬编码值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21295111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com