【问题标题】:Force join inside of mapping of class强制加入类映射内部
【发布时间】:2013-10-31 22:06:53
【问题描述】:

假设我有 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问题。

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

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

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

所以我想知道是否有可能在我的班级 Message 的映射中强制加入。

【问题讨论】:

  • 为什么消息类的属性是“public virtual string User { get; set; }”......你为什么不做“public virtual User TheUser {get;set; } ......... 请注意,我在校对 NIBerate 时使用“The”前缀以避免歧义。
  • 附言。我是在“询问”……而不是“攻击”。也许你有正当的理由。但对我来说它看起来有点可疑。
  • 这不仅是可疑的,而且是完全错误的;)我简化了我的真实映射并忽略了这一点。我编辑了问题,谢谢提示!
  • @granadaCoder:根据我的更正,你知道如何解决这个问题吗?
  • 不,我看过了。这个超出了我的范围。

标签: c# nhibernate join fluent-nhibernate fluent-nhibernate-mapping


【解决方案1】:

应该可以做这样的事情

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

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

【讨论】:

  • 根据 NHProf 的说法,这两项修改都不会影响创建的 SQL 查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-16
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多