gpt4 book ai didi

c# - 如何映射NHibernate变量表引用?

转载 作者:行者123 更新时间:2023-11-30 12:25:37 25 4
gpt4 key购买 nike

有一个名为 ChildTable 的表,其中包含 2 列 SourceTableSourceId 以及一些其他表 ParentTable1ParentTable2

SourceId 中找到的 Id 可用于在 SourceTable 具有与该表关联的值时连接到父表 (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 个属性: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");

对于更新/插入,它可能可以使用访问器实现,稍后将发布更新。

最佳答案

你为什么不使用Any

类:

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,它将任何类型的集合映射到关系表中。

在查询中使用它时,可以检查.class,或者使用子查询:

总部:

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')

关于c# - 如何映射NHibernate变量表引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31099121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com