流畅的nHibernate映射具有固定值的HasMany复合键

时间:2012-08-30 15:02:04

标签: c# .net fluent-nhibernate fluent-nhibernate-mapping

我正在尝试为大型现有系统实现nHibernate映射。 试图映射两个对象之间的关系。一个对象是“附件”,它涉及整个系统中的许多不同对象。所以在数据库中它有两列用于关联自己

的ItemType

项目Id

如果我有带附件的产品,那么ProductId = ItemId和ItemType将是预定义值E.g. '0001'用户对象可能是'0002',Order可能是'0003',依此类推其他ItemTypes。

现在我需要在nhibernate中映射它。所以我希望在Product对象上有一组附件,但这意味着将它映射到ItemId和ItemType

如果它只是必需的ItemId映射,它可以做

HasMany(x => x.Attachments).KeyColumn("ProductId");

但相反,我需要将它映射到KeyColumn“ProductId”和Attachments表中的ItemType等于'0001'

我怎么能这样做??

结构产品表

  

[产品]

     

产品编号

     

姓名

     

描述

附件表

  

[附件]

     

AttachmentURL

     

项目Id

     

的ItemType

2 个答案:

答案 0 :(得分:1)

我要做的是创建一个基本的,抽象的附件类型,如下所示:

public abstract class Attachment
{
    public TYPE AttachmentURL { get; set; }
}

然后为每个附件'type'创建一个子类:

public class ProductAttachment : Attachment
{
    protected ProductAttachment() { }

    public ProductAttachment(Product parent)
    {
        Parent = parent;
    }

    public Product Parent { get; protected set; }
}

然后,在您的附件映射中,您将包含以下行:

DiscriminateSubClassesOnColumn("ItemType");

然后为每个子类映射添加一个'DiscriminatorValue'调用。例如:

// Inside ProductAttachment mapping
...
DiscriminatorValue("0001");
...

然后,就像平常一样映射一切。这为您的产品提供了一个额外的好处,即您的产品将有一个'ProductAttachment'列表,该列表需要'parent'作为产品。

从数据库中获取基本类型“附件”(与“ProductAttachment”相对)时可能会有一些奇怪之处,但是当它/它来时,你可以越过那个桥。

答案 1 :(得分:0)

在这里找到答案

Fluent Nibernate putting a where clause in the mapping

我可以像这样硬编码映射

HasMany(x => x.Children).Where("ItemType='0001'");