0

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

物品种类

项目 ID

如果我有一个带有附件的产品,那么 ProductId = ItemId 和 ItemType 将是一个预定义的值,例如“0001”,其中用户对象可能是“0002”,订单可能是“0003”,以此类推。

现在我需要在 nhibernate 中映射它。所以我想在产品对象上有一个附件集合,但这意味着将它映射到 ItemId 和 ItemType

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

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

但相反,我需要将其映射到附件表中 KeyColumn“ProductId”和 ItemType 等于“0001”的位置

我怎么能这样……?

结构产品表

[产品]

产品编号

姓名

描述

附表

[附件]

附件网址

项目 ID

物品种类

4

2 回答 2

1

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

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

然后为每个附件“类型”创建一个子类:

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”列表,这将要求“父级”是一个产品。

从数据库中仅获取基本类型“附件”(而不是“产品附件”)时可能会有些奇怪,但是当/如果它出现时,您可以越过那座桥。

于 2012-08-30T17:09:58.310 回答
0

在这里找到了答案

Fluent Nibernate 在映射中放置 where 子句

我可以像这样对映射进行硬编码

HasMany(x => x.Children).Where("ItemType='0001'");
于 2012-08-31T08:31:40.337 回答