2010-08-10 3 views
9

У меня есть модель, такие как это (упрощенный)Fluent NHibernate - Карта списка строк

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

В моей базе данных, у меня есть сообщение таблицы и таблица PostAttachment

Сообщение Attachment таблица 2 колонки:

AttachmentKey сообщения дан

(основы этого в том, что вложение загружается амазонки s3, так что AttachmentKey является s3 ключ)

То, что я хочу сделать, это отобразить AttachmentKey к списку возвращенного/вставленное сообщение объекта ...

Как бы я идти об этом?

ответ

2

Возможно, вам понадобится тип вокруг строки, чтобы иметь возможность генерировать имя таблицы. Что-то вроде List может быть более значимым в вашем приложении в любом случае. Я уверен, что вы можете копать глубже и направить карту прямо к строке, если вам нужно.

Оттуда вы можете начать с отображением HasMany и внешним ключом, указывающим на ваш пост таблицу, т.е.

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

Я думаю, что по умолчанию это будет выглядеть для столбца POST_ID в вашей таблице (не нужно чтобы присутствовать на объекте после прикрепления), я уверен, что есть способ обойти это, если вам это нужно.

Возможно, вам понадобится также .Inverse() для отображения, в зависимости от того, как вы хотите сохранить почтовые вложения.

Редактировать: после просмотра сообщения Diego, я думаю, что приведенное выше может просто работать, если PostAttachments - это список строк. Я использовал метод, который он опубликовал в предвзятые дни, и я уверен, что HasMany по умолчанию сопоставляется с сумкой nhibernate. Вероятно, вам нужно указать имена столбцов в вашем сопоставлении, чтобы использовать существующую таблицу.

+1

Это неправильный ответ. См. Мой ответ ниже. HasMany (x => x.Attachments) .KeyColumn («PostID») .Table («PostAttachment»). Элемент («AttachmentKey»); – regisbsb

6

Если я не понял вопроса, это просто так:

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

BTW, Attachments должен быть IList<string>, не List<string>.

+0

О, я вижу, вы свободно говорите. Ну, вам нужно будет найти то, что эквивалентно отображению наборов значений. –

+1

"BTW, Attachments должен быть IList , а не список " спас мою жизнь, изначально у меня был ISet , и он не сохранялся в этих строках ... cheers – xhafan

4

Мне потребовалось время, чтобы разобраться, как это сделать с помощью Fluent. Это на самом деле довольно просто:

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

    Id(x => x.Id); 

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

Для поддержки этого вам нужно создать таблицу отображения (MyClassStrings), который имеет два столбца:

  • String - столбец, где
  • внешний ключ обратно к таблице MyClass
+0

Это сработало отлично для меня. –

+0

См. Мой ответ ниже. Это правильнее. – regisbsb

11

@ ben-hughes Вы почти получили его.

Вам не нужно другое сопоставление.

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

Это работает для меня! –

Смежные вопросы