Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Fluent nHibernate映射有许多固定值的复合键_C#_.net_Fluent Nhibernate_Fluent Nhibernate Mapping - Fatal编程技术网

C# Fluent nHibernate映射有许多固定值的复合键

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和

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

项目类型

项目ID

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

现在我需要在nhibernate中绘制这个。因此,我希望在产品对象上有一个附件集合,但这意味着要跨ItemId和ItemType映射它

如果只是需要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且未指定默认值。谢谢,我没有时间测试插入,但在测试插入时会记住这一点!