我拥有许多子实体的顶级实体。
现在,我希望实现FindAll()方法,我正在使用此模式将所有顶级实体查询到List。那很好,但我随后用它来获取我的所有子对象,警告:在nhib中选择N + 1。探查。
获取所有对象后,我将它们发送到FromMyDomainModel方法,以将值提取到我需要的ViewModel。
using (ITransaction transaction = session.BeginTransaction())
{
List<Property> data =
session.Query<Property>()//I don't need fetch
.ToList();
transaction.Commit();
return EntityViewModel.FromDomainModel(data);
}
也许有更好的模式,所以请随时发布。
更新:映射代码 从映射你可以把它看作我的实体代码
public PropertyMap()
{
Table("Property");
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.Version);
Map(x => x.Created);
Map(x => x.Updated);
Map(x => x.Views);
....
Map(x => x.Price);
HasMany(x => x.Photos).KeyColumn("PropertyId").Cascade.All();
}
public PhotoMap()
{
Table("Photo");
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.ImageData).CustomSqlType("VARBINARY(MAX)").Length(160000).Not.Nullable();
Map(x => x.ImageMimeType).Not.Nullable();
References(x => x.Property).Column("PropertyId");
}
答案 0 :(得分:0)
要减少select n+1
问题,您需要设置batch-size
NH3.2 +默认将加载批量大小设置为20,所以如果你可以升级那么我会推荐它。见here [NH-2593]
如果您无法升级,并且如果使用XML映射,请执行以下操作: -
<bag/set/list ... batch-size='50' ..>
...
</bag/set/list>
如果您不使用XML映射,请发布映射示例。
根据您更新的地图进行修改
尝试这个并重新配置,你应该看到你的n + 1减少了50
HasMany(x => x.Photos).KeyColumn("PropertyId")
.SetAttribute("batch-size", "50").Cascade.All();
此外,您可以在构建会话工厂之前在配置中设置此批量大小,以便它适用于所有集合提取。