2009-07-31 7 views
0

J'ai un modèle de données que je ne suis pas sûr que nHibernate supporte couramment - se demandait si quelqu'un pouvait me dire si oui, et si oui, comment le faire. La structure de base est:nHibernate "HasMany" sans FK explicites

create table Container (
    id int identity(1,1) NOT NULL, 
    root_item_id int 
) 

create table ItemRelationship (
    id int identity(1, 1) NOT NULL, 
    parent_item_id INT, 
    child_item_id INT 
) 

create table Item (
    id int identity(1, 1) NOT NULL, 
    description VARCHAR(20) 
) 

Donc, en résumé: 1) Container a une racine article 2) Les articles peuvent avoir des enfants Articles

Ce que je veux est une propriété sur mon entité "Container" que est une collection des objets qui sont les ENFANTS de son objet racine. Je peux voir comment configurer les relations FK « directes », mais celui-ci est un peu inhabituel, comme la chaîne de la relation est:

Container.root_item_id -> ItemRelationship.parent_item_id

Il n'y a pas une FK il explicite. Je suppose que je dois utiliser la méthode "Where" d'une certaine manière, mais je ne suis pas sûr de savoir comment - n'a pas pu trouver des exemples. Des idées?

Répondre

0

Je pense que votre problème peut être résolu avec une propriété de commodité relativement facile; Laissez-moi voir si j'ai ce droit:

Vous avez une relation de plusieurs à plusieurs entre les éléments (maintenue dans la table ItemRelationship). Par conséquent, par défaut, vous devriez être en mesure de définir une classe Item avec une propriété pour ChildItems (votre ClassMap pour cela aura un appel HasManyToMany()). Votre classe Container aura une propriété Root_Item de type Item (qui, comme mentionné précédemment, a une liste ChildItems). Ensuite, vous pouvez créer une propriété de commodité sur Container qui renvoie les ChildItems de son Root_item. par exemple:

public class Container 
{ 
    public virtual Item Root_Item { get; set; } 

    public List<Item> ChildItems 
    { 
     get { 
      if (Root_Item != null) 
       return Root_Item.ChildItems; 
      return new List<Item>(); // or null depending on how you want to handle this 
     } 
    } 
} 
+0

Cela m'a donné ce dont j'avais besoin! Merci! – Marty

Questions connexes