假设我有两个表:
表MY_ENTITY
ID: PK
OTHER_ID: FK to table 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连接到表KeyColumn
中OTHER
中指定的列。有点像:
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
如何实现这一目标?
答案 0 :(得分:1)
您必须向OtherId
添加MyEntity
属性(它不必是公开的;它仅用于映射)并在Join Key映射中使用PropertyRef
(这是按代码映射的方法名称;它是XML中的property-ref
,您必须查找Fluent)
或者,将Other
映射为实体,并在Reference
中使用MyEntity
。你可以级联所有,所以它与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; }
}
答案 1 :(得分:1)
也许您应该使用References
(many-to-one
)映射。
References(x => x.Other, "OTHER_ID")
.Fetch.Join()