2009-12-14 4 views
1

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

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

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

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

ответ

4

Fluent NHibernate release 1.0 не поддерживает фильтры NHibernate или фильтры-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); 
+1

Это кажется довольно тяжеловес учитывая то, что я пытаюсь сделать, но если свободный не поддерживает какой-либо другой метод, я думаю, это то, что я должен буду делать! –

+0

Речь идет не только о том, что поддерживает Fluent, но о том, что поддерживает NHibernate. Вы всегда можете использовать файл сопоставления XML для определения и применения фильтра, если хотите ...;) –

0

Willn Это не кандидат на Where?

HasManyToMany(x => x.Whatevers) 
    .Where(x => x.Active); 
+0

Я боюсь, что нет. Столбец, который я хочу фильтровать, - это таблица «ResourceService», которая является ссылкой. я дам ему выстрелили, но компилятор не нравится: HasManyToMany (Функция (о качестве услуг) o.ProvidedBy) _ .Cascade() _ .Все() _ .table ("ResourceService ") _ .ParentKeyColumn (" ServiceId ") _ .ChildKeyColumn (" ResourceId ") _ . Где (функция (x As ResourceService) x.Active) –

+2

Взорванное форматирование. –

0

Фактически вы можете достичь внешних условий соединения с помощью фильтров.

См FluentNHibernate HasManyToMany Conditional Mappings

+5

Чувак, ты застрял в рекурсивной петле в Интернете! –

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