Условные сопоставления FluentNHibernate HasManyToMany

Есть ли способ отфильтровать строки в сопоставлении HasManyToMany?

У меня есть три таблицы (устаревшие, не могу их изменить) Service, Resource и ResourceService. ResourceService позволяет нескольким ресурсам связываться с несколькими службами, но также имеет столбец «Активно».

В моем объекте домена ресурсов я сопоставил службы, связанные с ресурсом, со свойством «ProvidedBy», которое возвращает массив служб. Проблема в том, что мне нужны только строки из служб, помеченных как активные.

Я пропустил что-то основное здесь?


person Neil Ramsbottom    schedule 14.12.2009    source источник


Ответы (3)


Fluent NHibernate версии 1.0 не поддерживал фильтры NHibernate или filter-defs. Некоторое время назад я отправил патч Джеймсу Грегори и его команде, который они теперь включили в сундук, поэтому, если вы получите сундук, а не релизную версию, вы обнаружите, что возможность делать такие вещи включена.

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

public class TestFilter : FilterDefinition
{
    public TestFilter()
    {
        WithName("test")
            .WithCondition("Age > :age")
            .AddParameter("age", NHibernateUtil.Int32);
    }
}

а затем примените этот фильтр к свободному отображению:

HasManyToMany(x => x.Oldies)
    .Table("People")
    .ApplyFilter<TestFilter>();

Вы можете установить значение параметра и включить фильтр, используя объект сеанса, как обычно:

session.EnableFilter("test").SetParameter("age", 65);
person David M    schedule 14.12.2009
comment
Это кажется довольно тяжелым, учитывая то, что я пытаюсь сделать, но если Fluent не поддерживает какой-либо другой метод, я думаю, это то, что мне придется сделать! - person Neil Ramsbottom; 14.12.2009
comment
Вопрос не столько в том, что поддерживает Fluent, сколько в том, что поддерживает NHibernate. Вы всегда можете использовать файл сопоставления XML для определения и применения вашего фильтра, если хотите... ;) - person David M; 14.12.2009

Разве это не кандидат на Where?

HasManyToMany(x => x.Whatevers)
  .Where(x => x.Active);
person James Gregory    schedule 17.12.2009
comment
Я не боюсь. Столбец, который я хочу отфильтровать, — это таблица ResourceService, которая является таблицей ссылок. Я попробовал, но компилятору это не нравится: HasManyToMany(Function(o As Service) o.ProvidedBy) _ .Cascade() _ .All() _ .Table(ResourceService) _ .ParentKeyColumn(ServiceId) _ .ChildKeyColumn(ResourceId) _ .Where(Function(x As ResourceService) x.Active) - person Neil Ramsbottom; 18.12.2009

На самом деле вы можете достичь условий внешнего соединения, используя фильтры.

См. условные сопоставления FluentNHibernate HasManyToMany.

person Chris Haines    schedule 07.03.2011
comment
Чувак, ты загнал меня в рекурсивный цикл в сети! - person Mike Goatly; 03.05.2011