我正在尝试为大型现有系统实现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
答案 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'");