【发布时间】:2013-10-31 22:06:53
【问题描述】:
假设我有 2 个课程,User 和 Message
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