另一个Fluent NH加入问题

时间:2010-12-09 21:17:17

标签: c# nhibernate join fluent-nhibernate

我有一个网站。此站点驻留在特定的TimeZone中,并具有指定类型的Internet连接。这两个属性都存储在DB的Site表中,作为单独查找表中记录的外键。我永远不会这样做,但我明白为什么(强制执行一组通用的名称,给出一个更小的DB大小,在某些情况下允许标准化的附加信息,并允许轻松检索值列表以用作DDL)。

我正在构建一个必须包含此信息检索的映射。我想避免必须为一个字段构建一个域对象和映射(在某些情况下,除了查找表的ID之外,还有其他所有字段),所以相反我想要对关系进行非规范化并且只是对象上的字符串值。简单的目标。

问题是我尝试使用的Join假定Site表的主键在查找表的某处被引用;实际上,我们假设网站处于关系的“一”方面,这是不准确的。以下是相关的映射行:

Id(x=>x.Id).Column("SiteID");

...

Join("lu_TimeZone", j =>
{
   j.KeyColumn("TimeZoneID");
   j.Map(x => x.TimeZone).Column("TimeZone");
});

生成的SQL包括连接:

FROM Site this_0_ 
inner join lu_TimeZone this_0_1_ 
   on this_0_.SiteID=this_0_1_.TimeZoneID

*蜂鸣器*对不起,这是不正确的,谢谢你玩。联接应该是:

FROM Site this_0_ 
inner join lu_TimeZone this_0_1_ 
   on this_0_.TimeZoneID=this_0_1_.TimeZoneID

但似乎没有办法告诉Fluent使用KeyColumn作为连接两侧的列名。撤销将TimeZone加入Site的映射是不可行的,因为从Site到其他查找表有多个连接。

1 个答案:

答案 0 :(得分:0)

作为一个墓志铭,我最终做了两件事之一:

  • 对于只有一个字段可能感兴趣的表格,我创建了一个键入表格ID的枚举,并使用自定义类型将它们映射为枚举。

  • 对于可能有多个值的表,我创建并映射了一个域对象。

如果没有将子表作为对象引用,可能无法使上述连接行为工作。