【发布时间】:2015-06-30 05:57:28
【问题描述】:
有一个名为 ChildTable 的表,其中包含 2 列 SourceTable 和 SourceId 以及其他一些表 ParentTable1、ParentTable2 等。
当SourceTable 具有与父表关联的值(1 -> ParentTable1、2 -> ParentTable2)时,在 SourceId 中找到的 Id 可用于连接到父表。例如,要获取与ParentTable1 中的行相关联的所有ChildTable 行,可以使用以下查询来实现:
select *
from ChildTable ct
join ParentTable1 pt1
on ct.SourceTable = 1 and ct.SourceId = pt1.Id
我想将这 2 个 ChildTable 列映射为每个父表的 1 个属性:Parent1、Parent2...,因此其中 1 个不为空,其余的父属性为空:
public class ChildClass
{
public Parent1Class Parent1 { get; set; }
public Parent2Class Parent2 { get; set; }
public Parent3Class Parent3 { get; set; }
.
.
.
}
问题是:这种情况下的映射怎么写(可能的话用代码映射)?
注意:这是为了映射现有表,重构表模式还不是解决方案(但欢迎提出建议)。
更新
出于查询的目的,将 ChildClass 属性 Parent1 映射为:
ManyToOne(property => property.Parent1, map => map.Formula("(select pt1.Id from dbo.ParentTable1 pt1 where SourceTable = 1 and pt1.Id = SourceId)"));
和 Parent1Class 的 Children 集合:
mapper.Where("SourceTable = 1");
对于更新/插入,它可能可以使用访问器来实现,稍后会发布更新。
【问题讨论】:
-
在你想要的 ChildClass 中是 Parent1Class 类型的所有属性,还是 Parent1/2/3Class?
-
啊,谢谢你的注意,这是一个错字,它们是不同的类型。
-
您有一个条件,您希望使用 where 子句过滤多对一映射 - 基于 SourceId。你能确认 SourceIds 是固定的吗?似乎有一个未解决的jira。
-
该问题似乎正在寻找解决我问题的方法。
SourceId被修复是什么意思? -
SourceId列中可以有重复值,但对于每个SourceTable,它们必须是唯一的。基本上SourceTable和SourceId的组合是独一无二的。如果每个 SourceId 指向不同的父表(ParentTable1、ParentTable2、ParentTable3),则可以让 SourceId = 1 用于 3 行
标签: c# nhibernate nhibernate-mapping