2010-08-10 17 views
9

Mam modelu takich jak ten (uproszczony)Fluent NHibernate - Mapa listę ciągów

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

w mojej bazy danych, mam tabeli Post, oraz tabelę PostAttachment

post tabela Załącznik ma 2 kolumny:

postID AttachmentKey

(podstawy tego są takie, że przywiązanie zostanie dodane do amazon S3, więc AttachmentKey jest s3 key)

Co chcę zrobić, to odwzorować AttachmentKey do listy zwrócony/wstawionego obiektu post ...

Jak bym go o to robi?

Odpowiedz

2

Możesz potrzebować typu wokół napisu, jeśli tylko możesz wygenerować nazwę tabeli. Coś takiego jak List może i tak być bardziej znaczącym w twojej aplikacji. Jestem pewien, że możesz głębiej zagłębić się w mapę, a jeśli chcesz, zmapować ją bezpośrednio na ciąg.

Stamtąd można zacząć od mapowania hasMany i kluczowy wskazując obcego do tabeli postu, czyli

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

myślę domyślnie będzie to wyglądać na kolumnie post_id w tabeli (nie potrzebuje być obecnym na przedmiocie załączania), jestem pewny, że istnieje również sposób obejścia tego, jeśli tego potrzebujesz.

Może być potrzebna również funkcja .Inverse() w zależności od tego, w jaki sposób mają być zapisywane załączniki do postów.

edycja: po obejrzeniu postu diego, myślę, że powyższe może po prostu działać, jeśli PostAttachments jest listą ciągów. Użyłem metody, którą opublikował w ciągu ostatnich kilku dni, i jestem prawie pewien, że HasMany mapuje domyślnie torbę nhibernate. Prawdopodobnie będziesz musiał podać nazwy kolumn w swoim mapowaniu, aby użyć istniejącej tabeli.

+1

To nie jest poprawna odpowiedź. Zobacz moją odpowiedź poniżej. HasMany (x => x.Attachments) .KeyColumn ("PostID") .Table ("PostAttachment") Element ("AttachmentKey"); – regisbsb

6

Chyba, że ​​źle na pytanie, to właśnie to:

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

BTW, Attachments powinny być IList<string> nie List<string>.

+0

Och, widzę, że używasz płynnie. Cóż, musisz znaleźć odpowiednik mapowania zbiorów wartości. –

+1

"BTW, Załączniki powinny być ILIST , a nie List " uratowałem mi życie, początkowo miałem ISet i nie utrzymywałem tych strun ... okrzyki – xhafan

4

Zajęło mi trochę czasu, aby dowiedzieć się, jak to zrobić z Fluent. To rzeczywiście dość prosta:

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

    Id(x => x.Id); 

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

Aby to obsługiwać, trzeba utworzyć tabelę mapowania (MyClassStrings), który ma dwie kolumny:

  • String - kolumnę gdzie
  • klucz obcy z powrotem do tabeli MyClass
+0

To działało idealnie dla mnie. –

+0

Zobacz moją odpowiedź poniżej. To jest bardziej poprawne. – regisbsb

11

@ ben-hughes Prawie masz.

Nie potrzebujesz kolejnego mapowania.

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

To działa dla mnie! –

Powiązane problemy