代码之家  ›  专栏  ›  技术社区  ›  Alex

Fluent Nhibernate-映射字符串列表

  •  9
  • Alex  · 技术社区  · 14 年前

    我有一个这样的模型(简化)

    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表

    后置附件表有两列:

    波斯蒂德 附件密钥

    (最基本的是附件上传到AmazonS3,所以附件密钥是S3密钥)

    我要做的是将attachmentkey映射到返回/插入的post对象的列表…

    我该怎么做呢?

    4 回复  |  直到 11 年前
        1
  •  2
  •   AlexCuse    14 年前

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

    从这里开始,您可以使用一个hasmany映射和一个指向post表的外键,即

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

    我认为在默认情况下,这将在您的表中查找一个post-id列(不需要出现在post-attachment对象上),如果您需要,我相信也有一种方法可以解决这个问题。

    您可能还需要在映射上使用.inverse(),这取决于您希望如何保存post附件。

    编辑: 在看到迭戈的帖子后,我认为如果post-attachments是一个字符串列表,那么上面的内容就可以了。我已经使用了他在前一个流畅的日子发布的方法,并且我很确定默认情况下有很多地图到一个NHibernate包。不过,您可能需要在映射中指定列名才能使用现有表。

        2
  •  13
  •   regisbsb    11 年前

    @本·休斯,你差点就明白了。

    您不需要另一个映射。

    HasMany(x => x.Attachments)
        .KeyColumn("PostID")
        .Table("PostAttachment").Element("AttachmentKey");
    
        3
  •  6
  •   Diego Mijelshon    14 年前

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

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

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

        4
  •  4
  •   Ben Hughes    13 年前

    我花了一段时间才想出如何用流利的语言来做这件事。其实很简单:

    public MyClassMapping()
    {
        Table("MyClass");
    
        Id(x => x.Id);
    
        HasMany(x => x.Strings)
            .Table("MyClassStrings")
            .Element("String");
    }
    

    要支持这一点,您需要创建一个映射表(myClassStrings),该表有两列:

    • string-列,其中
    • 返回表myclass的外键