繁体   English   中英

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

[英]Fluent nHibernate Mapping HasMany Composite Key with Fixed Value

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

物品种类

ItemId

如果我的产品带有附件,则ProductId = ItemId,并且ItemType将是预定义的值,例如'0001',其中User对象可能是'0002',Order可能是'0003',依此类推。

现在我需要在nhibernate中映射它。 所以我想在Product Object上收集附件,但这意味着将其跨ItemId和ItemType映射

如果仅需要ItemId映射,则可以执行

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

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

我该怎么办...?

结构产品表

[产品]

产品编号

名称

描述

附件表

[附件]

附件网址

ItemId

物品种类

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

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

从数据库中仅获取基本类型“附件”(而不是“ ProductAttachment”)时可能会有些怪异,但是当/如果有这种情况,您可以跨越该桥梁。

在这里找到答案

流利的Nibernate在映射中放置where子句

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM