2010-08-10 1 views
9

ich ein Modell wie dieses haben (vereinfacht)Fluent NHibernate - Karte eine Liste von Strings

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; } 
} 

In meiner Datenbank habe ich einen Beitrag Tisch, und eine PostAttachment Tabelle

Beitrag Anhang Tabelle hat 2 Spalten:

PostID AttachmentKey

(die Grundlagen davon sind, dass die Bindung an Amazon s3 hochgeladen wird, so dass der AttachmentKey ist die s3 key)

Was ich tun möchte, ist die AttachmentKey in die Liste eines zurück/eingefügt Beitrag Objekt Karte ...

Wie würde ich über das tun dies gehen?

Antwort

2

Möglicherweise benötigen Sie einen Typ um die Zeichenfolge, um nur einen Tabellennamen generieren zu können. Etwas wie Liste kann in Ihrer Anwendung sowieso sinnvoller sein. Ich bin mir sicher, dass Sie tiefer eindringen und direkt auf die Saite zeichnen können, wenn Sie es brauchen.

Von dort können Sie mit einem HasMany Mapping und einem Fremdschlüssel zeigt auf Ihre Post Tabelle beginnen, dh

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

ich standardmäßig denke, das für eine post_id Spalte in der Tabelle aussehen wird (nicht braucht auf dem Post-Attachment-Objekt zu sein), ich bin mir sicher, dass es auch einen Weg gibt, wenn du es brauchst.

Möglicherweise benötigen Sie auch eine .Inverse() im Mapping, je nachdem, wie die Post-Anhänge gespeichert werden sollen.

bearbeiten: nachdem ich die Post von Diego gesehen habe, denke ich, dass das obige nur funktionieren kann, wenn PostAttachments eine Liste von Strings ist. Ich habe die Methode benutzt, die er in den vorletzten Tagen gepostet hat, und ich bin mir ziemlich sicher, dass HasMany standardmäßig auf eine Nhibernate-Tasche verweist. Sie müssen wahrscheinlich Spaltennamen in Ihrem Mapping angeben, um die vorhandene Tabelle zu verwenden.

+1

Dies ist nicht die richtige Antwort. Siehe meine Antwort unten. HasMany (x => x.Attachments) .KeyColumn ("PostID") .Tabelle ("PostAttachment"). Element ("AttachmentKey"); – regisbsb

6

Wenn ich die Frage falsch verstanden, es ist nur dies:

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

BTW, Attachments sollte ein IList<string>, nicht List<string> sein.

+0

Oh, ich sehe, du benutzt fließend. Nun, Sie müssen herausfinden, was für das Mapping von Wertesammlungen äquivalent ist. –

+1

"BTW, Anhänge sollten ein IList , nicht Liste " gespeichert mein Leben, ursprünglich hatte ich ISet und es bestand nicht diese Strings ... Prost – xhafan

4

Es hat eine Weile gedauert, bis ich herausgefunden hatte, wie es mit Fluent funktioniert. Es ist eigentlich ziemlich einfach:

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

    Id(x => x.Id); 

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

Um dies zu unterstützen, müssen Sie eine Zuordnungstabelle (MyClassStrings) erstellen, die zwei Spalten:

  • String - die Spalte, in der
  • ein Fremdschlüssel zurück zum Tisch MyClass
+0

Dies funktionierte perfekt für mich. –

+0

Siehe meine Antwort unten. Es ist richtiger. – regisbsb

11

@ ben-hughes Sie haben es fast geschafft.

Sie benötigen keine weitere Zuordnung.

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

Es funktioniert für mich! –