2009-10-18 7 views
1

J'ai cette classe de produit que j'ai pris des exemples d'utilisation de nhibernate (mais j'ai fait quelques modifications) Je veux être en mesure de cartographier un classe et toutes ses références dans la base de données.NHIBERNATE: Comment mapper une collection dans la base de données en utilisant Mapping.Attributes

[NHibernate.Mapping.Attributes.Class(Lazy=true)] 
    public class Product 
    {    
     [NHibernate.Mapping.Attributes.Id(Name="Id",TypeType=typeof(Guid))] 
     public virtual Guid Id { get; set; } 

     [NHibernate.Mapping.Attributes.Property] 
     public virtual string Name { get; set; } 

     [NHibernate.Mapping.Attributes.Property] 
     public virtual int Category { get; set; } 

     [NHibernate.Mapping.Attributes.Property] 
     public virtual bool Discontinued { get; set; } 

     [NHibernate.Mapping.Attributes.Map(Name="Items")] 
     public virtual Dictionary<Guid, SubItem> Products { get; set; } 
    } 

où sous-élément est défini comme suit:

[NHibernate.Mapping.Attributes.Class(Lazy = true)] 
    public class SubItem 
    { 
     [NHibernate.Mapping.Attributes.Id(Name = "Id", TypeType = typeof(Guid))] 
     public virtual Guid Id { get; set; } 

     [NHibernate.Mapping.Attributes.Property] 
     public virtual string Name { get; set; }    
    } 

et je reçois la exeption suivante cédant que « L'élément « carte » espace de nom « urne: NHibernate-mapping-2.2 » a contenu incomplet » . probablement quelque chose qu'il manque là mais je ne sais pas quoi. et si c'est la bonne façon de le faire. (Je veux être en mesure de sérialiser l'objet suivant:

SubItem sub1 = new SubItem(); 
sub1.Id = Guid.NewGuid(); 
sub1.Name = "sub1"; 
SubItem sub2 = new SubItem(); 
sub2. Id = Guid.NewGuid(); 
sub2.Name = "sub2"; 

Product p= new Product(); 
p.Name = "itay"; 
p.Category = 111; 
p.Discontinued = false; 
p.Id = Guid.NewGuid(); 

Product p1= new Product(); 
p1.Name = "Joe"; 
p1.Category = 222; 
p1.Discontinued = true; 
p1.Id = Guid.NewGuid(); 

p.Products = new System.Collections.Generic.Dictionary<Guid, SubItem>(); 
p.Products.Add(sub1.Id, sub1); 
p.Products.Add(sub2.Id, sub2); 
p1.Products = new System.Collections.Generic.Dictionary<Guid, SubItem>(); 
p1.Products.Add(sub1.Id,sub1); 

Je me demande comment NHibernate présentera cette situation dans le DB (-t-il créer une table diffrent pour les objets sous-élément comment il traiter la propriété des produits avec? la carte Attribute sur elle ....

Modifier: je veux être en mesure de créer un ManyToMany cartographie - qui, dans le DB deviendra une autre table avec les années Id pertinentes (ProductID, SubItemId)

L'aide sera appréciée!

Répondre

0

Vous devez fournir les informations de clé et d'index pour la carte. Vos attributs ressemblerait à quelque chose comme ...

[Map(0, Inverse = true)] 
    [Key(1, Column = "ProductId")] 
    [Index(2, Column = "SubItemId", TypeType = typeof(Guid))] 
    [OneToMany(3, ClassType = typeof(SubItem))] 
    public virtual Dictionary<Guid, SubItem> Products { get; set; } 
+0

Salut G, 10x pour la réponse rapide. J'ai essayé votre exemple de code mais j'ai eu une situation dans la base de données qui n'était pas mon intention. NHibernate a créé dans la table Products deux colonnes supplémentaires appelées ProductId, & SubItemId. ceci est créé deux porblems: 1. il y a déjà une colonne Id dans la table Products (appelée Id, qui est et identity et autogenerated) 2. Je veux que ce mapping soit passé hors de la table des produits (et ensuite le premier problème devenir irrlevent) - peut-être que je dois remplacer l'attribut OneToMany avec ManyToMany? –

+0

Je n'étais pas sûr des noms de colonne que vous utilisiez alors j'ai inventé des noms raisonnables pour illustrer. Il semble que vous souhaitiez remplacer ProductId par Id. Vous ne devriez pas avoir besoin de ManyToMany à moins qu'un sous-élément puisse appartenir à plusieurs produits. –

+0

Si j'utilise l'attribut ManyToMany - je dois aussi définir une nouvelle classe? afin de définir le ClassType pertinent? ou cela peut-il être fait automatiquement? Le SubItem peut appartenir à plusieurs produits (les noms des classes que je définis ne sont pas très bons parce que c'est juste un exemple ...) –