Fluent nHibernate - сопоставление списка строк - PullRequest
9 голосов
/ 10 августа 2010

У меня есть такая модель (упрощенно)

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

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

Таблица Post Attachment имеет 2 столбца:

PostID AttachmentKey

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

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

Как мне поступить?

Ответы [ 4 ]

13 голосов
/ 25 октября 2013

@ ben-hughes Ты почти понял.

Вам не нужно другое отображение.

HasMany(x => x.Attachments)
    .KeyColumn("PostID")
    .Table("PostAttachment").Element("AttachmentKey");
6 голосов
/ 10 августа 2010

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

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

Кстати, Attachments должно быть IList<string>, а не List<string>.

4 голосов
/ 15 марта 2012

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

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

    Id(x => x.Id);

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

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

  • String - столбец, в котором
  • внешний ключ обратно на стол MyClass
2 голосов
/ 10 августа 2010

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

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

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

Я думаю, что по умолчанию это будет искать столбец post_ID в вашей таблице (не обязательно должен присутствовать в объекте post-attachment), я уверен, что есть способ обойти это, если вам это нужно.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...