2010-08-10 5 views
9

j'ai un tel modèle (simplifié)Courant NHibernate - Carte une liste de chaînes

public class Post 
{ 
    public string ID { get; set; }  
    public string Title { get; set; } 
    public string Body { get; set; } 
    public string AuthorName { get; set; } 

    public List<string> Attachments { get; set; } 
} 

Dans ma base de données, j'ai une table Post, et une table PostAttachment

post Table de fixation a 2 colonnes:

postID AttachmentKey

(les bases de ce que la fixation est téléchargé à s3 Amazon, de sorte que le AttachmentKey est le s3 clé)

Ce que je veux faire est la carte la AttachmentKey à la liste d'un retour/inséré objet Post ...

Comment dois-je prendre?

Répondre

2

Vous pouvez avoir besoin d'un type autour de la chaîne, ne serait-ce que pour pouvoir générer un nom de table. Quelque chose comme List peut être plus significatif dans votre application de toute façon. Je suis sûr que vous pouvez creuser plus profondément et mapper directement à la chaîne si vous en avez besoin.

De là, vous pouvez commencer par une cartographie hasMany et un pointage de clé étrangère à votre table de poste, à savoir

HasMany (o => o.PostAttachments).ForeignKeyConstraintName ("FK_Attachment_Post"); 

Je pense que par défaut, ce cherchera une colonne post_id dans votre table (n'a pas besoin être présent sur l'objet de la pièce jointe), je suis sûr qu'il y a un moyen de contourner cela aussi si vous en avez besoin.

Vous pouvez également avoir besoin d'un .Inverse() sur le mappage, en fonction de la manière dont vous souhaitez enregistrer les pièces jointes.

éditer: après avoir vu la publication de diego, je pense que ce qui précède peut fonctionner, si PostAttachments est une liste de chaînes. J'ai utilisé la méthode qu'il a publiée dans les jours précédents, et je suis sûr que HasMany correspond à un sac de nhibernate par défaut. Vous aurez probablement besoin de spécifier des noms de colonnes dans votre mapping pour utiliser la table existante.

+1

Ce n'est pas la bonne réponse. Voir ma réponse ci-dessous. HasMany (x => x.Attachments) .KeyColumn ("PostID") .Table ("PostAttachment"). Elément ("AttachmentKey"); – regisbsb

6

À moins d'avoir mal compris la question, il est juste ceci:

<bag name="Attachments" table="Attachment"> 
    <key column="PostId" /> 
    <element column="AttachmentKey" /> 
</bag> 

BTW, Attachments devrait être un IList<string>, non List<string>.

+0

Oh, je vois que vous utilisez couramment. Eh bien, vous devrez trouver quel est l'équivalent pour la cartographie des collections de valeurs. –

+1

"BTW, pièces jointes devrait être un IList , pas la liste " sauvé ma vie, à l'origine j'avais ISet et il ne persistait pas ces chaînes ... acclamations – xhafan

4

Il m'a fallu du temps pour trouver comment le faire avec Fluent. Il est en fait assez simple:

public MyClassMapping() 
{ 
    Table("MyClass"); 

    Id(x => x.Id); 

    HasMany(x => x.Strings) 
     .Table("MyClassStrings") 
     .Element("String"); 
} 

À cette fin, vous devez créer une table de correspondance (de MyClassStrings) qui a deux colonnes:

  • String - la colonne où le
  • arrière
  • une clé étrangère à la table MyClass
+0

Cela a fonctionné parfaitement pour moi. –

+0

Voir ma réponse ci-dessous. C'est plus correct. – regisbsb

11

@ ben-hughes Vous l'avez presque compris.

Vous n'avez pas besoin d'un autre mappage.

HasMany(x => x.Attachments) 
    .KeyColumn("PostID") 
    .Table("PostAttachment").Element("AttachmentKey"); 
+0

Ca marche pour moi! –

Questions connexes