映射一个兄弟对象的集合,其中一个兄弟对象持有另一个的集合

本文关键字:兄弟 集合 一个 对象 另一个 映射 | 更新日期: 2023-09-27 18:02:22

我有一个像这样的对象集合

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; }
}

我想让我的模型工作的方式是它们都被我的站点对象绑定在一起。我的业务逻辑确保一个ApplicationParameters是"活动的",其余的都保存在History集合中。

我的问题出现在将它们与Fluent一起映射时。我有这样的东西

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,其中兄弟姐妹具有相同的SiteId?我知道我可以使用.Where("Status = 4"),但其余的映射我不确定。

编辑

我需要澄清一下我的设计。

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

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

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

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

映射一个兄弟对象的集合,其中一个兄弟对象持有另一个的集合

在NHibernate中,当映射一个实体集合时,你必须在集合表中提供一个键列,该键列引用回父表。.Where("")只是在此基础上提供了额外的过滤。

在你的例子中,如果ApplicationParameters的列表属于ApplicationConfiguration,那么它应该有ApplicationConfigurationId列。

如果你需要通过SiteId绑定对象,那么你应该将ApplicationParametersHistory移动到Site实体。

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

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

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

这是你想要的吗?