休眠查询

本文关键字:查询 休眠 | 更新日期: 2023-09-27 18:31:32

我有这个域模型,

class UserInfo{
    int UserId{get;set;}
    string UserName{get;set;}
    IList<Task> Tasks{get;set;}
}
class Task{
    int TaskId{get;set;}
    string TaskName{get;set;}
    UserInfo AssignedTo{get;set;}
}
class UserMap: ClassMap<UserInfo>
{ 
    public UserMap()
    {
        Id(x=>x.UserId);
        Map(x=>x.UserName)
        HasMany(x=>x.Tasks);
    }
 }

现在,可以为用户分配任意数量的任务,但"活动"始终为"无"或"一个"。它存储在另一个表中,并通过另一个实体定义。因此,如果子任务有活动任务,则活动任务表中存在一条记录。

class ActiveTask{
    int Id{get;set;}
    int UserId{get;set;}
    int TaskId{get;set;}
    datetime CreatedOn{get;set;}
}

问题

  • 如何将活动任务与用户信息映射
  • 我想获取用户列表以及活动任务(如果有)。

请建议如何做

休眠查询

我认为

你很难找到一个好的答案,因为它将取决于其他因素,例如你期望给定用户拥有的任务数量。也就是说,听起来您正在尝试使用单个Task集合,并简单地将其中一个标记为活动。从领域的角度来看,我敢打赌这就是事情的现实。人有很多任务,一个是活跃的。活动任务仍然是任务。

如果是这种情况,那么一种选择是向Task对象添加 IsActive 属性,然后将映射中的获取策略设置为预先(否则您将遇到选择 n+1 问题)。然后,ActiveTask属性可以使用 linq 选择集合中具有Active == trueTask

如果你走这条路,那么你需要在类中添加逻辑来设置活动任务,以便所有其他任务都设置为非活动。像这样:

class UserInfo
{
    public virtual int UserId{get;set;}
    public virtual string UserName{get;set;}
    public virtual IList<Task> Tasks{get;set;}
    public virtual Task ActiveTask
    {
        get
        {
            return Tasks.FirstOrDefault(t => t.IsActive == true);
        {
    }
    public void SetActive(Task task)
    {
        // Set all tasks to inactive
        // Set the task in question to active
    }
}
如果是我,

我可能还会将Tasks集合从自动属性更改为具有支持字段并使用protected internal进行设置,以便您可以确保仅在映射期间分配列表。

请注意,如果您有大量用户或任务,则急切获取策略可能会变得昂贵。在这种情况下,您可能希望使用单独的表来跟踪哪个任务处于活动状态并以这种方式进行映射。

更新

回去检查了我做过的其他一些具有类似要求的项目,在一个案例中,我实际上对其进行了更改,以便父对象包含对活动子对象的引用。因此,数据库中的UserInfo表将具有与Task表的 PK 相关的 FK 列ActiveTask_Id。然后,您的用户映射将是这样的(假设您正在覆盖自动映射):

public class UserInfoOverride : IAutoMappingOverride<UserInfo>
{
    public void Override(AutoMapping<UserInfo> mapping)
    {
        mapping.References(x => x.ActiveTask).Fetch.Join();
    }
}

然后,您只需将任务设置为 UserInfo 对象的 ActiveTask 属性并保存即可。