使用反向FK连接映射中的表
本文关键字:映射 连接 FK | 更新日期: 2023-09-27 18:29:35
假设我有两个表:
表MY_ENTITY
ID: PK
OTHER_ID: FK to table OTHER
表OTHER
ID: PK
COL: The column I want
我的实体看起来是这样的:
class MyEntity : Entity
{
public virtual Column { get; set; }
}
我的自动映射覆盖看起来像这样:
mapping.IgnoreProperty(x => x.Column);
mapping.Join("OTHER", x => x.KeyColumn("ID").Optional()
.Map(y => y.Column, "COL");
这可以很好地工作并且执行起来没有问题,但是联接是错误的。
它创建一个SQL语句,将MY_ENTITY
的PK连接到表OTHER
中KeyColumn
中指定的列。大致如下:
select ... from MY_ENTITY e left outer join OTHER o on e.ID = o.ID
然而,我需要这样的加入:
select ... from MY_ENTITY e left outer join OTHER o on e.OTHER_ID = o.ID
如何做到这一点?
您必须向MyEntity
添加一个OtherId
属性(它不必是公共的;它只是用于映射),并在Join-Key映射中使用PropertyRef
(这是代码映射中的方法名称;它是XML中的property-ref
,您必须查找它以查找Fluent)
或者,将Other
映射为实体,并在MyEntity
中使用Reference
。您可以级联所有,这样它就可以与MyEntity一起被持久化/删除。
然后,只需投影引用的属性(不会在MyEntity中映射):
class MyEntity
{
public virtual PropertyType Property
{
get
{
EnsureOther();
return Other.Property;
}
set
{
EnsureOther();
other.Property = value;
}
}
void EnsureOther()
{
if (Other == null)
Other = new Other();
}
public virtual Other { get; set; }
}
class Other
{
public virtual PropertyType Property { get; set; }
}
也许您应该使用References
(many-to-one
)映射。
References(x => x.Other, "OTHER_ID")
.Fetch.Join()