Fluent nHibernate - 映射字符串列表

Ale*_*lex 9 c# nhibernate 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; }
}
Run Code Online (Sandbox Code Playgroud)

在我的数据库中,我有一个Post表和一个PostAttachment表

帖子附件表有2列:

PostID AttachmentKey

(基本原理是附件上传到amazon s3,所以AttachmentKey是s3键)

我想要做的是将AttachmentKey映射到返回/插入的Post对象的List ...

我该怎么做呢?

reg*_*bsb 13

@ ben-hughes你几乎得到了它.

您不需要另一个映射.

HasMany(x => x.Attachments)
    .KeyColumn("PostID")
    .Table("PostAttachment").Element("AttachmentKey");
Run Code Online (Sandbox Code Playgroud)


Die*_*hon 6

除非我误解了这个问题,否则就是这样:

<bag name="Attachments" table="Attachment">
  <key column="PostId" />
  <element column="AttachmentKey" />
</bag>
Run Code Online (Sandbox Code Playgroud)

顺便说一句,Attachments应该是IList<string>,不是List<string>.


Ale*_*use 2

如果只是为了生成表名,您可能需要字符串周围的类型。无论如何,像 List 这样的东西在您的应用程序中可能更有意义。我相信如果需要的话,您可以更深入地挖掘并直接映射到字符串。

从那里您可以从 HasMany 映射和指向您的帖子表的外键开始,即

HasMany (o => o.PostAttachments).ForeignKeyConstraintName ("FK_Attachment_Post");
Run Code Online (Sandbox Code Playgroud)

我认为默认情况下,这将在您的表中查找 post_ID 列(不需要出现在帖子附件对象上),我确信如果您需要的话,也有办法解决这个问题。

您可能还需要在映射上使用 .Inverse(),具体取决于您希望如何保存帖子附件。

编辑:在看到迭戈的帖子后,我认为如果 PostAttachments 是一个字符串列表,上面的方法可能会起作用。我已经使用了他在前几天发布的方法,并且我很确定 HasMany 默认映射到 nhibernate 包。不过,您可能需要在映射中指定列名称才能使用现有表。