Соединение таблицы в отображении с обратным FK - PullRequest
1 голос
/ 29 марта 2012

Предположим, у меня есть две таблицы:

Таблица 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, который присоединяет PK MY_ENTITY к столбцу, указанному в 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

Как этого добиться?

Ответы [ 2 ]

1 голос
/ 29 марта 2012

Возможно, вам следует вместо этого использовать отображение References (many-to-one).

References(x => x.Other, "OTHER_ID")
    .Fetch.Join()
1 голос
/ 29 марта 2012

Вам нужно будет добавить свойство OtherId к MyEntity (оно не должно быть общедоступным; оно только для сопоставления) и использовать PropertyRef в сопоставлении ключа соединения (это имя метода в сопоставлении). по коду; он property-ref в XML, вам придется искать его свободно)

В качестве альтернативы, сопоставьте 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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...