Fluent nHibernate PropertyRef 急切地获取引用的记录。我可以禁用它吗?
Fluent nHibernate PropertyRef is eagerly fetching referenced records. Can I disable it?
如果我在引用(多对一)上指定 PropertyRef - 它会急切地获取所有相关记录:
References(x => x.Panel).PropertyRef(x => x.Code).Not.Insert().Not.Update();
我可以禁用 N + 1 select 问题吗?
在这里我可以看到这个问题是已知的,但是有什么解决方法吗?
Lazy loading not working for many-to-one relationship when mapping to a non-key field using property-ref
有一个解决方法。但只是因为你的多对一是只读的 (我们以后不必关心 insert/udpate 问题)。如何?通过引入虚拟实体,例如PanelView
// Readonly mapping, virtual class
// which ID role is playing column panel_CODE
public PanelViewMapping()
{
Table("panel-table");
Id(x => x.Code)
.Column("panel_CODE")
.GeneratedBy.Assigned();
...
现在,我们必须调整 POCO 实体:
// instead of this
// public virtual Panel Panel { get; set; }
// we will have this
public virtual PanelView Panel { get; set; }
然后我们可以把它作为主键映射:
References(x => x.Panel)
//.PropertyRef(x => x.Code)
.Not.Insert()
.Not.Update();
并且所有功能 (延迟加载) 将正常工作。
如果我在引用(多对一)上指定 PropertyRef - 它会急切地获取所有相关记录:
References(x => x.Panel).PropertyRef(x => x.Code).Not.Insert().Not.Update();
我可以禁用 N + 1 select 问题吗?
在这里我可以看到这个问题是已知的,但是有什么解决方法吗? Lazy loading not working for many-to-one relationship when mapping to a non-key field using property-ref
有一个解决方法。但只是因为你的多对一是只读的 (我们以后不必关心 insert/udpate 问题)。如何?通过引入虚拟实体,例如PanelView
// Readonly mapping, virtual class
// which ID role is playing column panel_CODE
public PanelViewMapping()
{
Table("panel-table");
Id(x => x.Code)
.Column("panel_CODE")
.GeneratedBy.Assigned();
...
现在,我们必须调整 POCO 实体:
// instead of this
// public virtual Panel Panel { get; set; }
// we will have this
public virtual PanelView Panel { get; set; }
然后我们可以把它作为主键映射:
References(x => x.Panel)
//.PropertyRef(x => x.Code)
.Not.Insert()
.Not.Update();
并且所有功能 (延迟加载) 将正常工作。