Fluent nHibernate - 映射字符串列表

时间:2010-08-10 11:18:54

标签: 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; }
}

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

帖子附件表有两列:

帖子ID AttachmentKey

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

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

我将如何做到这一点?

4 个答案:

答案 0 :(得分:13)

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

您不需要其他映射。

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

答案 1 :(得分:6)

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

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

BTW,Attachments应该是IList<string>,而不是List<string>

答案 2 :(得分:4)

我花了一段时间才弄清楚如何用Fluent做到这一点。这实际上非常简单:

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

    Id(x => x.Id);

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

为了支持这一点,您需要创建一个包含两列的映射表(MyClassStrings):

  • String -
  • 所在的列
  • 将一个外键返回到表MyClass

答案 3 :(得分:2)

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

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

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

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

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

在看到diego的帖子后,

编辑,如果PostAttachments是一个字符串列表,我认为上面的内容可能正常。我已经使用了他在流畅的日子里发布的方法,我很确定HasMany默认情况下映射到nhibernate包。您可能需要在映射中指定列名以使用现有表。