2009-10-08 3 views
0

Ceci est un peu de questions conceptuelles mais je pense que c'est le bon endroit pour le demander. Je travaille avec NHibernate depuis un certain temps, mais j'ai du mal à utiliser les collections dans les objets POCO. 1. Je pense que le concept de proxy est sympa mais quand vous voulez l'utiliser dans une architecture multi-niveaux, cela devient un défi. . 2. Je souhaite ajouter une logique métier à tout type de requête de la base de données. par exemple, restrictions d'autorisation, etc. 3. Je voudrais ajouter une logique métier lorsque j'ajoute ou supprime une entité d'une collection.Nhibrnate POCO objets avec des relations, mais pas de collections - Mutli tier

et il y a d'autres raisons pour lesquelles j'ai des problèmes avec les collections et les proxies.

Je pensais qu'il y avait peut-être un moyen d'utiliser l'objet POCO sans aucune collection et laisser la couche de service pour gérer les sous requêtes et l'association etc ... Je comprends que la collection est nécessaire pour que le Nhibernate fonctionne Je suis hors de la couche de service je veux flatter les objets et sortir toutes les collections. De cette façon, je peux mettre en œuvre mes propres opérations et la logique métier.

Y at-il un moyen standard de le faire? dois-je attacher et détacher les objets? comment puis-je créer un objet DTO à partir de l'objet POCO et copier les champs etc ...

Quelqu'un at-il des bonnes pratiques pour cela et a fait la même chose?

Je pouvais simplement créer les objets POCO sans aucune relation et ne laisser savoir à nhibernat que ces relations via le mapping. puis en utilisant la session, je peux contrôler les associations entre les objets.

Merci, Noam

+0

Je ne suis pas sûr que je comprends parfaitement votre question.NH n'a en aucun cas besoin de quoi que ce soit pour fonctionner (excepté une valeur d'ID), donc vous pouvez simplement ignorer n'importe quoi dans le mapping que vous ne voulez pas/besoin. Mais je suppose que ce n'était pas ta question (du moins pas entièrement)?! –

+0

Vous n'avez pas besoin de toujours spécifier la collection dans le mappage. Tant que l'autre extrémité a le plusieurs-à-un, vous pouvez gérer ces collections séparément. Je définis généralement la collection uniquement pour la commodité de cascade = "delete". – dotjoe

Répondre

0

Si vous voulez avoir un contrôle complet dans votre collection, je peux vous suggérer cette approche:

  1. Vous utilisez une collection en lecture seule:

    virtuel public ReadOnlyCollection ChildActions { get { return new ReadOnlyCollection (nouvelle liste (childActions)); }}

  2. Pour la cartographie, vous pouvez utiliser le terrain de support

    Iset privé childActions;

  3. Pour vous assurer que votre collection ne sera jamais nul (éviter les contrôles unnessesary), vous pouvez à la prochaine chose contructor:

    childActions = new HashedSet();

  4. Pour ajouter et supprimer des éléments de la collection, vous pouvez utiliser des méthodes:

    public virtual void AddChildAction(ActionOnClient actionToAdd) 
    { 
        //some logic here 
    
        childActions.Add(actionToAdd); 
    } 
    public virtual void AddChildAction(ActionOnClient actionToAdd) 
    { 
        //some logic here 
    
        childActions.Remove(actionToAdd); 
    } 
    

    Cette approche vous donnera un contrôle total de vos collections. J'espère que cela aide

+0

Cela semble bien je vais essayer. et vous permettra de savoir ce que je trouve. –

Questions connexes