1

我在两个现有表(User: UserId, Name)(Location: LocationId, Name)之间有多对多关系,这些无法更改。我使用了多对多映射,但我们有一个新要求,包括历史/未来运动。

我使用了 peoplesoft 的概念,即在替换旧表的新相交表(UserLocation:UserId、LocationId、EffectiveDate、Status)中有效地对记录进行约会,其中前 3 个字段构成主键。

在 SQL 中,我可以简单地使用以下语句返回给定生效日期的活动记录,但我无法从 NHibernate 获得类似的信息(甚至会收到有关参数在多级选择中不起作用的错误)。

select l.*  
from location l  
where l.locationId in  
  (select ul.locationId  
   from UserLocation ul  
   where (ul.EffectiveDate =   
     (select max(ul_ed.EffectiveDate)  
      from UserLocation ul_ed  
      where ul.LocationId = ul_ed.LocationId  
        and ul.EffectiveDate = ul_ed.EffectiveDate  
        and ul.UserId - ul_ed.UserId  
        and ul.Status = true))  

我需要通过包含 UserId 和 EffectiveDate 列的参数来返回进一步过滤的记录,但很乐意返回所有内容。

然而,我的问题是映射类(我使用代码映射,而不是流利的),甚至无法让它接近工作(有限的 NHibernate 知识)。我希望不必为相交表创建一个新类。我什至还没有进入插入/更新/删除部分,因为我什至无法让 select 工作。

要求: 1. 在将用户关联到 EffectiveDate = NOW,Status = True 的位置时,在 UserLocation 中插入新记录 3. 将用户移动到新位置应在 UserLocation 中插入新记录,EffectiveDate = NOW,Status = True 4. 删除来自该位置的用户将插入新的 UserLocation 记录,其 EffectiveDate = NOW,Status = False 5. 检索用户在给定日期关联到的位置。

注意:由于会根据这些数据生成报告,因此我们无法删除记录,并且还会为将来的事件创建数据。

如果有人能指出我正确的开始方向,那将不胜感激。我查看了 Loader 和 Interceptor 类,但似乎无法使其适合。

4

2 回答 2

0

您需要一个用于 intersect 表的类,因为它具有两个额外的属性。然后可以像这样实施第一个要求......

public virtual void AddLocation(Location l)
{
    this.UserLocations.Add(new UserLocation
    {
        EffectiveDate = DateTime.Now(),
        Status = true,
        User = this,
        Location = l
    });
}

查询应该有点直截了当。只需要将 JoinAlias 加入 intersect 表并比较 EffectiveDate。

于 2012-08-07T20:55:38.203 回答
0

这是我们提出的适用于所描述场景的答案。

Filter("EffectiveDate", mm => mm.Condition("Status = 1 and EffectiveDate = (select max(t1.EffectiveDate) from Table1 t1 where t1.Id = Id and t1.EffectiveDate <= :effectiveDate)"));

过滤器可以应用于表和映射。然而,我们最终将 2 个表合并为一个表以降低复杂性。

注意:必须先定义过滤器并将其应用于会话,然后才能在映射中使用它。有关完整详细信息,请参阅 nHibernate doco,它有很好的文档记录。

于 2012-10-02T06:20:42.983 回答