我有一个像这样的模型(简化)
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 ...
我将如何做到这一点?
答案 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):
答案 3 :(得分:2)
如果只能生成表名,则可能需要字符串周围的类型。无论如何,像List这样的东西在你的应用程序中可能更有意义。我相信如果你需要,你可以深入挖掘并直接映射到字符串。
从那里你可以从HasMany映射和指向你的帖子表的外键开始,即
HasMany (o => o.PostAttachments).ForeignKeyConstraintName ("FK_Attachment_Post");
我认为默认情况下,这将在您的表中查找post_ID列(不需要出现在帖子附件对象上),我相信如果您需要它,也可以解决这个问题。
您可能还需要映射上的.Inverse(),具体取决于您希望如何保存帖子附件。
在看到diego的帖子后,编辑,如果PostAttachments是一个字符串列表,我认为上面的内容可能正常。我已经使用了他在流畅的日子里发布的方法,我很确定HasMany默认情况下映射到nhibernate包。您可能需要在映射中指定列名以使用现有表。