gpt4 book ai didi

nhibernate - 使用 Fluent NHibernate/Nhibernate 和 Automapping 快速加载

转载 作者:行者123 更新时间:2023-12-03 11:08:17 25 4
gpt4 key购买 nike

我需要加载一个名为 的复杂对象。节点 ...嗯,它不是那么复杂...它看起来如下:-

A 节点 引用了 实体类型 一对多属性(property)这反过来又与 一对多属性列表值

public class Node
{
public virtual int Id
{
get;
set;
}

public virtual string Name
{
get;
set;
}

public virtual EntityType Etype
{
get;
set;
}

}


public class EntityType
{
public virtual int Id
{
get;
set;
}

public virtual string Name
{
get;
set;
}

public virtual IList<Property> Properties
{
get;
protected set;
}

public EntityType()
{
Properties = new List<Property>();
}
}

public class Property
{
public virtual int Id
{
get;
set;
}

public virtual string Name
{
get;
set;
}

public virtual EntityType EntityType
{
get;
set;
}

public virtual IList<PropertyListValue> ListValues
{
get;
protected set;
}

public virtual string DefaultValue
{
get;
set;
}

public Property()
{
ListValues = new List<PropertyListValue>();
}
}


public class PropertyListValue
{
public virtual int Id
{
get;
set;
}

public virtual Property Property
{
get;
set;
}

public virtual string Value
{
get;
set;
}

protected PropertyListValue()
{
}
}

我试图做的是一次加载所有子对象的 Node 对象。没有延迟加载。原因是我在数据库中有数千个 Node 对象,我必须使用 WCF 服务通过网络发送它们。我遇到了类 SQL N+ 1 问题。我正在使用 Fluent Nhibernate 和 Automapping,NHibernate Profiler 建议我使用 FetchMode.Eager 一次加载整个对象。我正在使用以下 qyuery
     Session.CreateCriteria(typeof (Node))
.SetFetchMode( "Etype", FetchMode.Join )
.SetFetchMode( "Etype.Properties", FetchMode.Join )
.SetFetchMode( "Etype.Properties.ListValues", FetchMode.Join )

或使用 NHibernate LINQ
        Session.Linq<NodeType>()
.Expand( "Etype")
.Expand( "Etype.Properties" )
.Expand( "Etype.Properties.ListValues" )

当我运行上述任何查询时,它们都会生成一个具有所有左外连接的相同查询,这正是我所需要的。但是,出于某种原因,查询的返回 IList 未将属性加载到对象中。事实上,返回的 Nodes 计数等于查询的行数,因此 Nodes 对象是重复的。此外,每个 Node 内的属性都重复了,Listvalues 也是如此。

所以我想知道如何修改上面的查询以返回所有具有属性和列表值的唯一节点。

最佳答案

每个映射都必须延迟加载

在节点图中:

Map(x => x.EntityType).Not.LazyLoad();

在实体类型 map 中:
Map(x => x.Properties).Not.LazyLoad();

等等...

另见 NHibernate Eager loading multi-level child objects一次急切加载

添加:

关于 Sql N+1 的附加信息:

http://nhprof.com/Learn/Alerts/SelectNPlusOne

关于nhibernate - 使用 Fluent NHibernate/Nhibernate 和 Automapping 快速加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3142845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com