我有一个网站。此站点驻留在特定的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到其他查找表有多个连接。
答案 0 :(得分:0)
作为一个墓志铭,我最终做了两件事之一:
对于只有一个字段可能感兴趣的表格,我创建了一个键入表格ID的枚举,并使用自定义类型将它们映射为枚举。
对于可能有多个值的表,我创建并映射了一个域对象。
如果没有将子表作为对象引用,可能无法使上述连接行为工作。