如何映射 NHibernate 变量 table 引用?
How to map NHibernate variable table reference?
有一个名为 ChildTable
的 table,有 2 列 SourceTable
和 SourceId
以及其他一些 table ParentTable1
,ParentTable2
,等等
当 SourceTable
具有与 table 关联的值(1 -> ParentTable1
, 2 -> ParentTable2
)。例如,要获取与 ParentTable1
中的行关联的所有 ChildTable
行,可以使用以下查询来实现:
select *
from ChildTable ct
join ParentTable1 pt1
on ct.SourceTable = 1 and ct.SourceId = pt1.Id
我想将这 2 ChildTable
列映射为每个父 属性 1 table:Parent1,Parent2,...所以其中 1 个不为空,并且其余父属性将为空:
public class ChildClass
{
public Parent1Class Parent1 { get; set; }
public Parent2Class Parent2 { get; set; }
public Parent3Class Parent3 { get; set; }
.
.
.
}
问题是:如何为这种情况编写映射(如果可能的话通过代码映射)?
注意:这是为了映射现有的 tables,重构 table 模式还不是解决方案(但欢迎提出建议)。
更新
出于查询的目的,将 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");
对于 update/insert 它可能可以使用访问器实现,post 稍后会更新。
你为什么不用Any
?
Class:
public class ChildClass
{
public virtual ParentBase Parent { get; set; }
// beware of proxies when casting... this may not work like this
public Parent1Class Parent1 { get { return Parent as Parent1Class; } }
public Parent2Class Parent2 { get { return Parent as Parent2Class; } }
.
.
.
}
映射:
Any(x => x.Parent, typeof(int), m =>
{
m.IdType<int>();
m.MetaType<int>();
m.MetaValue(1, typeof(Parent1));
m.MetaValue(2, typeof(Parent2));
m.Columns(
id => id.Name("SourceId"),
classRef => classRef.Name("SourceTable"));
});
还有many-to-any
,它将任何类型的集合映射到关系table。
在查询中使用时,可以勾选.class
,或者使用子查询:
HQL:
select *
from ChildTable ct join Parent
where pt1.class = Parent1
或
select *
from ChildTable ct
Where ct.Parent in (from Parant2 p where p.Property = 'Hugo')
有一个名为 ChildTable
的 table,有 2 列 SourceTable
和 SourceId
以及其他一些 table ParentTable1
,ParentTable2
,等等
当 SourceTable
具有与 table 关联的值(1 -> ParentTable1
, 2 -> ParentTable2
)。例如,要获取与 ParentTable1
中的行关联的所有 ChildTable
行,可以使用以下查询来实现:
select *
from ChildTable ct
join ParentTable1 pt1
on ct.SourceTable = 1 and ct.SourceId = pt1.Id
我想将这 2 ChildTable
列映射为每个父 属性 1 table:Parent1,Parent2,...所以其中 1 个不为空,并且其余父属性将为空:
public class ChildClass
{
public Parent1Class Parent1 { get; set; }
public Parent2Class Parent2 { get; set; }
public Parent3Class Parent3 { get; set; }
.
.
.
}
问题是:如何为这种情况编写映射(如果可能的话通过代码映射)?
注意:这是为了映射现有的 tables,重构 table 模式还不是解决方案(但欢迎提出建议)。
更新
出于查询的目的,将 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");
对于 update/insert 它可能可以使用访问器实现,post 稍后会更新。
你为什么不用Any
?
Class:
public class ChildClass
{
public virtual ParentBase Parent { get; set; }
// beware of proxies when casting... this may not work like this
public Parent1Class Parent1 { get { return Parent as Parent1Class; } }
public Parent2Class Parent2 { get { return Parent as Parent2Class; } }
.
.
.
}
映射:
Any(x => x.Parent, typeof(int), m =>
{
m.IdType<int>();
m.MetaType<int>();
m.MetaValue(1, typeof(Parent1));
m.MetaValue(2, typeof(Parent2));
m.Columns(
id => id.Name("SourceId"),
classRef => classRef.Name("SourceTable"));
});
还有many-to-any
,它将任何类型的集合映射到关系table。
在查询中使用时,可以勾选.class
,或者使用子查询:
HQL:
select *
from ChildTable ct join Parent
where pt1.class = Parent1
或
select *
from ChildTable ct
Where ct.Parent in (from Parant2 p where p.Property = 'Hugo')