使用反向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连接到表OTHERKeyColumn中指定的列。大致如下:

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

如何做到这一点?

使用反向FK连接映射中的表

您必须向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; }
}

也许您应该使用Referencesmany-to-one)映射。

References(x => x.Other, "OTHER_ID")
    .Fetch.Join()