沉舟侧畔千帆进,病树前头万木春。这篇文章主要讲述为什么FetchKind不能使用Mapping.ByCode在NHibernate中工作相关的知识,希望能为你提供帮助。
我相信这个问题是由忽略FetchKind属性引起的。
我有一张员工表:
Employee
{
ID
Name
PositionCode
}
和一个位置表:
Position
{
Code
Description
}
我使用Mapping.ByCode加入了这些表并将Fetch设置为Join,但它似乎不起作用。
我查看了十几个堆栈溢出帖子,询问相同的问题,但似乎无法得到明确的答案。
public class EmployeeMapper: ClassMapping<
Employee>
{
public EmployeeMapper()
{
Lazy(false);
Table("EMPLOYEE");
Id(x =>
x.Id, m =>
m.Column("ID");
MapToOne(c =>
c.PositionCode, posMap =>
{
posMap.Lazy(LazyRelation.NoLazy);
posMap.Fetch(FetchKind.Join)
posMap.Column("CODE");
}
}
}
我使用了NHibernate探查器,其行为如下:
Select all employees
foreach employee
select position
【为什么FetchKind不能使用Mapping.ByCode在NHibernate中工作】请注意,这不是一个sql select,如果有1000个员工,则会扩展为1001个select语句(一个用于所有员工,然后是每个位置一个)。
如果有人可以提供帮助,将不胜感激。
答案一般的NHibernate方式如何避免1 + N问题是使用
BatchSize()
设置。这种方式应该比在映射中使用JOIN Fetching更合适(让我们用它来查询)有两个:
- 实体层面
- 收集水平
BatchSize(25)
通常,NHibernate将使用IN子句一次加载更多的集合(列表,映射),并使用更多的parentIds。这将导致cca 1+(N / 25)......我认为这是合理的。
直到我们不需要收集......它被懒散地加载。如果我们需要,它的所有部件都是分批装载的。
有一些类似的链接,与
BatchSize
设置和1 + N问题有关:- NHibernate QueryOver with Fetch resulting multiple sql queries and db hits
- Is this the right way to eager load child collections in NHibernate
- https://stackoverflow.com/questions/18419988/
推荐阅读
- 使用dapper扩展的外键和数据透视表
- NHibernate.MappingException(没有持久性:XYZ)
- 从app inventor中的google sheet调用用户名和密码
- 在Android Studio导入期间维护目录结构
- 如何在android中的日历上的特定日期设置点
- RecyclerView smoothScroll位于中心位置。安卓
- 在Android中创建用户可选择的字符串列表的最简单方法是什么()
- 使用回收视图时无法在Android模拟器中看到应用栏
- Android TV RecyclerView重点互动