使用反向FK连接映射表

时间:2012-03-29 10:51:50

标签: c# nhibernate fluent-nhibernate

假设我有两个表:

表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连接到表KeyColumnOTHER中指定的列。有点像:

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

如何实现这一目标?

2 个答案:

答案 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)

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

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