我有像这样的对象的集合
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对象分开,该对象在管理和客户端应用程序中使用。
答案 0 :(得分:1)
在NHibernate中,在映射实体集合时,必须在集合表中提供一个引用回父表的键列。 .Where("")
只是提供额外的过滤功能。
在您的情况下,如果ApplicationParameters
的列表属于ApplicationConfiguration
,那么它应该有ApplicationConfigurationId
列。
如果您需要通过SiteId
绑定对象,则应将ApplicationParametersHistory
移至Site
实体。
现在,您的模型在您的类和数据库中的表示方式不同。因此,如果您能够重新组织模型,那么您可以使用标准的映射方式。
答案 1 :(得分:0)
您可以使用HasMany方法映射您的收藏..
HasMany(x => x.ApplicationParametersHistory).Where("Status = 4");
这就是你要追求的吗?