Nhibernate映射文件中的硬编码值

Nhibernate映射文件中的硬编码值,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我是NHibernate的新手,我正在尝试创建一个映射文件来扩展数据模型项目。我正在映射的特定表在下图中称为AttributeDef,列ControlType实际上与表中名为Code的查找相关是的,我知道-应该有FK约束,但这种情况在本项目中非常常见,因此请忽略明显的吼叫,并将重点放在问题上。在大多数情况下,引用代码的表也有一列,其中包含来自表代码集的ID,因为代码中的键几乎不可避免地是复合键,但在这种情况下,可能不是因为原始作者认为它们都来自同一代码集,所以这有什么意义 现在,如果Attrib

我是NHibernate的新手,我正在尝试创建一个映射文件来扩展数据模型项目。我正在映射的特定表在下图中称为AttributeDef,列ControlType实际上与表中名为Code的查找相关是的,我知道-应该有FK约束,但这种情况在本项目中非常常见,因此请忽略明显的吼叫,并将重点放在问题上。在大多数情况下,引用代码的表也有一列,其中包含来自表代码集的ID,因为代码中的键几乎不可避免地是复合键,但在这种情况下,可能不是因为原始作者认为它们都来自同一代码集,所以这有什么意义

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

因此,如果在本例中,在AttributeDef中有一列代码集值,名义上称为FormControlCodeSet,那么在我的AttributeDef映射文件中,我将包括

一切都会好起来的。问题是,将该列添加到AttributeDef将是非常具有侵入性的,因为我将不得不进行许多其他更改以适应此情况,这将增加我正在进行的更改的风险因素,从客户的角度来看,考虑到他们的时间框架,这很可能是不可接受的

所以,尽管这是一件可怕的事情,但有没有可能用这句话来代替呢


用耳语说出它的硬编码值?这一价值在十年内没有改变,也不太可能很快改变,但它将使我们克服这一变化,并将强调需要扩大范围并实施额外列的纳入。我认识到这是多么可怕,但不幸的是,尽管ORM已经被淘汰了,但该数据库中的很多都不太适合ORM。

在使用NHiberante时,您不必轻声说出需求。由于与传统数据库(即固定数据库模式)的合作是相当标准的,所以NHibernate支持许多不同的设置

其中之一是一对替换设置:列vs公式。第一个按原样处理专栏,第二个可以做我们需要的任何事情。获取列,列,传递一个常量。因此:

<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,但如上所示,这两个选项都是可能的。

完美-谢谢!我一直在寻找像“常量”这样的元素,甚至没有考虑过“公式”。现在我只需要说服我的老板,依靠这些东西是多么糟糕,我们真的需要改善“关系”部分!如果这有什么帮助,那就太好了;享受NHibernateIt这让我想到我可以避免使用常量,现在我用一个查询来代替它。花了一段时间,因为我找不到一个好的解释,但是对于下面的人,您的任意SQL语句需要别名,或者NHibernate假定列属于映射的父表,并将它们作为别名。我还看到很多人说你必须用双引号括起来,但事实并非如此。因此,我最终从CodeSet中选择了CodeSet.CodeSet,其中CodeSet.ViewName='FormControl'非常有效。