C# FluentNHibernate-映射同级对象的集合,其中一个同级对象包含另一个同级对象的集合

C# FluentNHibernate-映射同级对象的集合,其中一个同级对象包含另一个同级对象的集合,c#,fluent-nhibernate,has-many,C#,Fluent Nhibernate,Has Many,我收集了一些像这样的东西 public class ApplicationConfiguration { public virtual long ApplicationConfigurationId { get; set; } public virtual Site Site { get; set; } public virtual ApplicationParameters ApplicationParameters { get; set; } public

我收集了一些像这样的东西

public class ApplicationConfiguration
{
    public virtual long ApplicationConfigurationId { get; set; }
    public virtual Site Site { get; set; }

    public virtual ApplicationParameters ApplicationParameters { get; set; }
    public virtual IList<ApplicationParameters> ApplicationParametersHistory { get; set; }
}

public class ApplicationParameters
{
    public virtual int ApplicationParametersId { get; set; }
    public virtual Site Site { get; set; }
    public virtual int Status { get; set; }
}

public class Site
{
    public virtual int SiteId { get; set; }
}
public class ApplicationConfigurationMap : ClassMap<ApplicationConfiguration>
{
    public ApplicationConfigurationMap()
    {
        Table("MerchantApplicationConfigurations");

        Id(x => x.ApplicationConfigurationId, "MerchantApplicationConfigurationId").GeneratedBy.Identity();

        References<Site>(x => x.Site, "SiteId");

        References<ApplicationParameters>(x => x.ApplicationParameters, "ApplicationParametersId");
    }
}
但是,我如何映射我的集合以拾取状态为4的所有
ApplicationParameters
,其中同级具有相同的站点ID?我知道我可以使用
.Where(“Status=4”)
,但其余的映射我不确定

编辑

我需要澄清一下我的设计

站点是遗留系统中使用的外部对象,因此我无法更改它。在创建这些应用程序(纸质应用程序,而不是软件应用程序)时,我必须保留所有更改的完整历史记录。我将应用程序分成了一系列不同的部分,这个配置对象是我们配置的应用程序的基础(定价、费用等)

该系统的工作方式是每个部分都可以编辑,编辑完成后,我创建一个具有活动状态的新记录,然后将具有非历史状态的前一项设置为历史记录。这样,每个站点在给定时间只有一条记录处于活动状态

我正在按站点拉回数据,因为我始终可以为该站点选择活动组件。如果我将我的应用程序片段绑定到
ApplicationConfiguration
,这意味着基本对象不能再遵循我的历史保存模型。我还希望避免将所有的部分分开并构建DTO


我不想将所有内容都附加到
站点
对象,因为它在共享此代码库的其他应用程序中使用。此数据模型仅在管理应用程序中使用,因此我希望将其与管理和客户端应用程序中使用的Site对象分开。

在NHibernate中,映射实体集合时,必须在集合表中提供一个键列,该键列引用回父表
。其中(“”
只提供了额外的过滤功能

在您的情况下,如果
ApplicationParameters
列表属于
ApplicationConfiguration
,那么它应该具有
ApplicationConfigurationId

如果需要通过
SiteId
绑定对象,则应将
ApplicationParametersHistory
移动到
Site
实体


现在,您的模型在类和数据库中的表示方式有所不同。因此,如果您能够稍微重新组织模型,则可以使用标准的映射方式。

在NHibernate中,映射实体集合时,必须在集合表中提供一个键列,该键列引用回父表
。其中(“”
只提供了额外的过滤功能

在您的情况下,如果
ApplicationParameters
列表属于
ApplicationConfiguration
,那么它应该具有
ApplicationConfigurationId

如果需要通过
SiteId
绑定对象,则应将
ApplicationParametersHistory
移动到
Site
实体


现在,您的模型在类和数据库中的表示方式有所不同。因此,如果您能够稍微重新组织您的模型,那么您可以使用标准的映射方式。

您可以使用HasMany方法来映射您的集合

HasMany(x => x.ApplicationParametersHistory).Where("Status = 4");

这就是你想要的吗?

你可以使用HasMany方法来绘制你的收藏

HasMany(x => x.ApplicationParametersHistory).Where("Status = 4");

这就是您想要的吗?

ApplicationParameters为什么不能在ApplicationConfiguration中使用外键,而不是引用站点?所需的映射方式似乎不可能。我的应用程序在任何时候进行编辑时都会创建一条新记录来保存历史记录。我无法将对象绑定回父对象,因为如果父对象被“编辑”,则链接将指向历史版本而不是“当前活动”版本ApplicationParameters不能将外键插入ApplicationConfiguration而不是引用站点,这是为什么?所需的映射方式似乎不可能。我的应用程序在任何时候进行编辑时都会创建一条新记录来保存历史记录。我无法将对象绑定回父对象,因为如果父对象被“编辑”,则链接将指向历史版本,而不是“当前活动”版本。两个对象的站点ID必须相同。两个对象的站点ID必须相同。我编辑了OP以进一步解释我的设计。我担心我可能必须在
应用程序配置
及其子部分之间进行硬链接。我希望避免这种情况,以确保一切都能遵循我的更新模型。我最终创建了一个视图,将
SiteId
上的两个表连接起来,从我的表
中选择
applicationparametrsid
,其中Status=4
,以及
ApplicationConfigurationId
,然后我在我的观点中做了一个
HasManyToMany
。这是一个很好的解决方案,我也在考虑多对多,但我不了解你的应用程序,因此没有提出更具体的建议。我编辑了OP,以进一步解释我的设计。我担心我可能必须在
应用程序配置
及其子部分之间进行硬链接。我希望避免这种情况,以确保一切都能遵循我的更新模型。我最终创建了一个视图,将
SiteId
上的两个表连接起来,从我的表
中选择
applicationparametrsid
,其中Status=4
,以及
ApplicationConfigurationId
,然后我在我的观点中做了一个
hasmanytomy
。这是一个很好的解决方案,我也在考虑多对多,但我不了解你的应用程序,因此没有提出更具体的建议。