2009-10-10 8 views
4

j'ai une classe simple qui ressemble à ceci ...Courant NHibernate automappings avec autoréférence

public class Item { 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual int ParentId { get; set; } 

    public virtual IList<Item> Children { get; private set; } 

    public Item() { 
     Children = new List<Item>(); 
    } 
} 

... où l'identification est la clé primaire et ParentId est la clé étrangère. Quand j'exécute ce code, je reçois le nom d'objet 'ItemToItem' incorrect. exception et je ne peux pas comprendre ce qui ne va pas? Il semble que NHibernate essaie de sélectionner à partir d'une table appelée ItemToItem ou quelque chose comme ça?

Répondre

0

Oui. nhibernate fluide voit cela comme une relation many-many. Je ne sais pas sur le dessus de la tête comment créer le type de relation que vous voulez. vous aurez probablement au moins voulez mettre en place un membre:

public virtual Item Parent{ get; set; } 
+0

L'élément parent a travaillé beaucoup, mais l'exception de mon poste existe toujours. – Marcus

7

CORRECTEMENT autoréférence

// Class 
public class Item 
{  
    public virtual int Id { get; set; }  
    public virtual string Name { get; set; }  
    public virtual Item Parent { get; private set; } 
    public virtual IList<Item> Children { get; set; }  
    public Item() {   
     Children = new List<Item>();  
    } 
} 

// Map 
References(x => x.Parent).Column("ParentId"); 
HasMany(x => x.Children).Cascade.All().KeyColumn("ParentId"); 

// Add Item 
session.Save(new Item { Description = "Electronics", 
         Children = { 
           new Item { Description = "PS2" }, 
           new Item { Description = "XBox" } 
         }}); 
// Get Item 
var items = 
      (from c in session.Linq<Item>() 
       where c.Parent == null 
       select c).ToList(); 
+0

Comment utiliser ce type de mappage dans la configuration de Fluently.Configure() lorsque je configure ma base de données, etc.? – Marcus

+0

J'ai utilisé Override et cela semble fonctionner. – Marcus

Questions connexes