C# Fluent nHibernate映射有许多固定值的复合键
我正在尝试为一个大型现有系统实现nHibernate映射。 正在尝试映射两个对象之间的关系。一个对象是“附件”,它与整个系统中的许多不同对象相关。因此,在数据库中,它有两列,用于关联自身 项目类型 项目ID 如果我有一个带有附件的产品,则ProductId=ItemId和ItemType将是一个预定义的值,例如“0001”,其中用户对象可能是“0002”,订单可能是“0003”,等等 现在我需要在nhibernate中绘制这个。因此,我希望在产品对象上有一个附件集合,但这意味着要跨ItemId和ItemType映射它 如果只是需要ItemId映射,那么它可以C# Fluent nHibernate映射有许多固定值的复合键,c#,.net,fluent-nhibernate,fluent-nhibernate-mapping,C#,.net,Fluent Nhibernate,Fluent Nhibernate Mapping,我正在尝试为一个大型现有系统实现nHibernate映射。 正在尝试映射两个对象之间的关系。一个对象是“附件”,它与整个系统中的许多不同对象相关。因此,在数据库中,它有两列,用于关联自身 项目类型 项目ID 如果我有一个带有附件的产品,则ProductId=ItemId和ItemType将是一个预定义的值,例如“0001”,其中用户对象可能是“0002”,订单可能是“0003”,等等 现在我需要在nhibernate中绘制这个。因此,我希望在产品对象上有一个附件集合,但这意味着要跨ItemId和
HasMany(x => x.Attachments).KeyColumn("ProductId");
但我需要将它映射到附件表中的KeyColumn“ProductId”和ItemType等于“0001”的位置
我该怎么做
结构产品表
[产品]
产品ID
名字
描述
附表
[附件]
附件URL
项目ID
项目类型
我要做的是创建一个基本的抽象附件类型,如下所示:
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”列表,该列表要求“父级”为产品
从数据库中只获取基类型“Attachment”(与“ProductAttachment”相反)时可能会有些奇怪,但当它出现时,您可以跨越这座桥。在这里找到了答案
我可以像这样硬编码映射
HasMany(x => x.Children).Where("ItemType='0001'");
谢谢,我正要尝试这个方法,这时我在别处找到了一个简单的解决方案。我不是100%确定,但我认为如果你这样做,你必须确保在插入新附件时手动指定ItemType值。拉附件可以,但插入附件会将其设置为a.)null b.)默认值(如果指定了)或c.)导致错误,因为该列不可为null且未指定默认值。谢谢,我没有时间测试插入,但在测试插入时会记住这一点!