2010-08-10 59 views
9

我有一個模型,像這樣的列表(簡體)功能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; } 
} 

在我的數據庫,我有一個帖子表,以及附着後表

柱連接表中有2列:

帖子ID AttachmentKey

(這樣做的基礎是該附件被上傳到Amazon S3,所以AttachmentKey是S3鍵)

我想要做的就是映射AttachmentKey到返回/插入Post對象的名單...

我怎麼會去這樣做呢?

回答

2

您可能需要圍繞字符串的類型,如果只能生成表名。無論如何,像List這樣的東西在你的應用中可能更有意義。我相信你可以深入挖掘,並根據需要直接映射到字符串。

從那裏,你可以用的hasMany映射和外鍵指向您的帖子表,即開始

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

我覺得默認這將查找在你的表中的列POST_ID(不需要在帖子附件對象上),如果你需要它,我相信也有辦法解決這個問題。

您也可能需要在映射上使用.Inverse(),具體取決於您希望如何保存Post Attachments。

編輯:看到迭戈的帖子後,我認爲上述可能只是工作,如果PostAttachments是一個字符串列表。我使用了他在流利日前發佈的方法,並且我很確定HasMany默認映射到一個nhibernate包。儘管你可能需要在映射中指定列名來使用現有的表。

+1

這不是正確的答案。請參閱下面的答案。 HasMany(x => x.Attachments) .KeyColumn(「PostID」) 。表(「PostAttachment」)。Element(「AttachmentKey」); – regisbsb 2013-10-25 14:22:55

6

除非我誤解了這個問題,它只是這個:

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

BTW,Attachments應該是一個IList<string>,不List<string>

+0

哦,我看你在用流利。那麼,你必須找到什麼是映射值集合的等價物。 – 2010-08-10 12:43:15

+1

「順便說一句,附件應該是一個IList ,而不是列表」救了我的命,原來我有ISet ,它並沒有堅持這些字符串......乾杯 – xhafan 2013-04-10 11:35:53

4

我花了一段時間才弄清楚如何用Fluent做到這一點。這其實很簡單:

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

    Id(x => x.Id); 

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

爲了支持這一點,你需要創建一個映射表(MyClassStrings),其中有兩列:

  • 字符串 - 列,其中
  • 外鍵回到表MyClass
+0

這對我來說非常合適。 – 2012-10-10 22:20:17

+0

請參閱下面的答案。這是更正確的。 – regisbsb 2013-10-25 14:22:15

11

@ ben-hughes你幾乎明白了。

您不需要另一個映射。

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

它適合我! – 2015-10-06 04:50:34