2009-12-14 4 views
1

Existe-t-il un moyen de filtrer les lignes dans un mappage HasManyToMany?FluentNHibernate HasManyToMany Mappages conditionnels

J'ai trois tables (héritage, pas en mesure de les changer) Service, Resource et ResourceService. ResourceService permet à plusieurs ressources de se connecter à plusieurs services, mais possède également une colonne "Actif".

Sur mon objet Domaine de ressources, j'ai mappé les services liés à la ressource avec une propriété "ProvidedBy" qui renvoie un tableau des services. Le problème est que je ne veux que des lignes de services marqués comme actifs.

Ai-je manqué quelque chose de basique ici?

Répondre

4

La version 1.0 de NHibernate n'était pas compatible avec les filtres NHibernate ou les filtres-defs. J'ai envoyé un patch à James Gregory et à l'équipe il y a quelque temps, qu'ils ont maintenant incorporé dans le coffre, donc si vous obtenez le coffre plutôt que la version, vous trouverez la possibilité de faire ce genre de chose.

Essentiellement, vous pouvez configurer une classe qui hérite de FilterDefinition comme ceci:

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

puis appliquer ce filtre dans votre mapping courant:

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

Vous pouvez définir la valeur de paramètre et activer le filtre en utilisant l'objet de session comme d'habitude:

session.EnableFilter("test").SetParameter("age", 65); 
+1

Cela semble assez lourd étant donné ce que je suis en train de faire, mais si Fluent ne supporte pas une autre méthode, je suppose que c'est ce que je vais devoir faire! –

+0

Il ne s'agit pas tant de savoir ce que Fluent supporte mais ce que NHibernate supporte. Vous pouvez toujours utiliser un fichier de mapping XML pour définir et appliquer votre filtre si vous préférez ...;) –

0

n'est-ce pas un candidat pour un Where?

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

J'ai bien peur que non. La colonne sur laquelle je souhaite filtrer est la table "ResourceService", qui est la table de liens. Je ne donne un coup de feu, mais le compilateur ne l'aime pas: HasManyToMany (Fonction (o en tant que service) o.ProvidedBy) _ .Cascade() _ .Toutes() _ .Table ("ResourceService ") _ .ParentKeyColumn (" ServiceId ") _ .ChildKeyColumn (" ResourceId ") _ .Where (Fonction (x en tant que ResourceService) x.Active) –

+2

Formatage foudroyé. –