2012-03-29 7 views
1

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

Таблица 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 

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

ответ

1

Вы должны добавить OtherId свойство MyEntity (он не должен быть публичным, это только для отображения) и использовать PropertyRef в Join Key картографирования (это имя метода в отображении кода, это property-ref в XML, вы должны будете смотреть его на 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; } 
} 
+0

Спасибо! Проекция - хорошая идея, и она прямо решила мой следующий вопрос: «Как правильно перенести объекты с объединенной таблицей с ПК»? :-) –

1

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

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

Да, это то, что предложил Диего. –

+0

Да, я видел ответ, когда я заканчивал это. –

Смежные вопросы