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

时间:2011-07-18 21:17:15

标签: 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 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处于“活动状态”,其余部分保存在历史记录集合中。

将这些与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对象分开,该对象在管理和客户端应用程序中使用。

2 个答案:

答案 0 :(得分:1)

在NHibernate中,在映射实体集合时,必须在集合表中提供一个引用回父表的键列。 .Where("")只是提供额外的过滤功能。

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

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

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

答案 1 :(得分:0)

您可以使用HasMany方法映射您的收藏..

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

这就是你要追求的吗?

相关问题