在类映射内部强制联接

本文关键字:内部 映射 | 更新日期: 2023-09-27 18:36:38

假设我有 2 个类,UserMessage

public class User
{
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
}
public class UserMap : ClassMap<User>, IMappedEntity
{
    public UserMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
    }
}

public class Message
{
    public virtual Guid Id { get; set; }
    public virtual string Text { get; set; }
    public virtual User TheUser { get; set; }
}
public class MessageMap : ClassMap<Message>, IMappedEntity
{
    public MessageMap()
    {
        Id(x => x.Id);
        Map(x => x.Text);
        References<User>(x => x.TheUser)
    }
}

当我想加载一些消息时,还必须加载引用的用户。据我所知,nHibernate通常通过为每个用户创建一个新的sql命令来做到这一点,从而导致N + 1问题。

经过一些研究,我发现了这个解决方案,它创建了 to 表的连接:

_session.Query<Message>().Fetch(x => x.TheUser)

不幸的是,我不能(轻松)实现这一点,因为访问数据的逻辑位于通用存储库中,并且也被许多其他类使用。

所以我想知道是否有可能在我的类Message映射中强制连接。

在类映射内部强制联接

应该能够做这样的事情

References<User>(x => x.TheUser)
    .Fetch
    .Join()

References<User>(x => x.TheUser)
    .Fetch
    .Select()