2010-12-04 2 views
2

J'ai cherché partout un exemple de ceci, mais il semble assez rare. Espérons que certains gourous de NHibernate sauront.Comment mapper une collection ValueObject avec des clés étrangères dans FluentNHibernate

J'ai la classe suivante qui, selon ma compréhension des objets de valeur, est un objet de valeur. Supposons que chaque utilisateur a la possibilité d'assigner un ou plusieurs tags à n'importe quelle question (pensez à Stack Overflow). Les balises n'ont pas besoin d'une clé primaire, mais elles contiennent des références à l'utilisateur et à la question, contrairement à la plupart des exemples de ValueObjects que je vois là-bas.

public class Tag : ValueObject 
{ 
    public virtual User User { get; set; } 
    public virtual Question Question { get; set; } 
    public virtual string TagName { get; set; } 
} 

public class User 
{ 
    public virtual IList<Tag> Tags { get; set; } 
} 

public class Question 
{ 
    public virtual IList<Tag> Tags { get; set; } 
} 

Quoi qu'il en soit, je reçois l'erreur suivante:

{ "L'entité « Tag » ne dispose pas d'un Id cartographié Utilisez la méthode Id pour mapper votre propriété d'identité Par exemple:.. Id (x => x.Id) "}

Je suivantes cartographie NHibernate Fluent pour l'utilisateur et question:.

public void Override(AutoMapping<XXX> mapping) 
     { 
      mapping.HasMany(x => x.Tags).Component(c => 
      { 
       c.Map(x => x.TagName); 
       c.Map(x => x.Question); 
       c.Map(x => x.User); 
      }); 
     } 

Comme toujours, toute pensée très appréciée.

Mise à jour tardive: D'accord, donc, ce n'est peut-être pas un objet de valeur. Il n'a pas besoin d'identité, mais je suppose que ce n'est pas quelque chose qui pourrait être utilisé à plusieurs endroits. Une façon de gérer cela sans forcer un champ Id inutile sur mon objet?

Répondre

0

Essayez ceci:

public void Override(AutoMapping<XXX> mapping) 
    { 
     mapping.HasMany(x => x.Tags).AsBag().Component(c => 
     { 
      c.Map(x => x.TagName); 
      c.References(x => x.Question); 
      c.References(x => x.User); 
     }); 
    } 

mais vous ne pouvez pas la requête (liste tous) balises alors parce que son objet de valeur.

Questions connexes