【发布时间】:2011-07-21 18:13:44
【问题描述】:
这是我的(简化的)模型:Ticket -> Customer Callback (s)
我已经映射了我的票证,因此当它加载时,回调也是如此。
base.HasMany<TechSupportCallback>(x => x.Callbacks)
.KeyColumn(Fields.TRACKED_ITEM_ID)
.Not.LazyLoad()
.Inverse()
.Cache.ReadWrite();
这不是延迟加载,否则当 Web 服务尝试序列化(和加载)代理时,我将得到“没有加载实体的会话”。 (使用存储库获取数据。)
它也是双向的..(在 CallbackMap 中)
base.References(x => x.Ticket)
.Column(Fields.TRACKED_ITEM_ID)
.Not.Nullable();
现在..我们需要向代理显示他们的回调列表 - 只是他们的回调。 -- 当我使用回调的条件进行查询时,我无法阻止票证(以及随后的整个图表,包括其他集合)被加载。我之前曾尝试设置 FetchMode.Lazy,然后迭代每个生成的 Callback 并将 Ticket 设置为 null,但这似乎被忽略了。
// open session & transaction in using (..)
var query = session.CreateCriteria<TechSupportCallback>()
.SetCacheable(true)
.SetCacheRegion("CallbacksByUserAndGroups")
.SetFetchMode("Ticket", FetchMode.Lazy) // <-- but this doesn't work!
.SetMaxResults(AegisDataContext.Current.GetMaxRecordCount())
;
rValue = query.List<TechSupportCallback>();
rvalue.ForEach(x => x.Ticket = null;); // <-- since this is already retrieved, doing this merely prevents it from going back across the wire
tx.Commit();
// usings end (..)
我应该用投影代替吗? 那个问题..是我无法找到用于填充实体或它们的列表的投影示例 - 只能用作子实体的子查询或类似限制的东西父实体列表。
我真的可以在这方面使用一些指导。
[编辑]
我尝试按照建议使用投影,但是:
我得到以下信息:(这是因为一个错误,所以我已经停止使用缓存并且它可以工作。http://nhibernate.jira.com/browse/NH-1090)
System.InvalidCastException occurred
Message=Unable to cast object of type 'AEGISweb.Data.Entities.TechSupportCallback' to type 'System.Object[]'.
Source=NHibernate
StackTrace:
at NHibernate.Cache.StandardQueryCache.Put(QueryKey key, ICacheAssembler[] returnTypes, IList result, Boolean isNaturalKeyLookup, ISessionImplementor session)
InnerException:
在
rValue = query.List<TechSupportCallback>();
投影列表定义如下
// only return the properties we want!
.SetProjection(Projections.ProjectionList()
.Add(Projections.Alias(Projections.Id(), ex.NameOf(x => x.ID))) //
.Add(Projections.Alias(Projections.Property(ex.NameOf(x => x.ContactID)), ex.NameOf(x => x.ContactID)))
// ...
)
.SetResultTra...;
rValue = query.List<TechSupportCallback>();
映射像
public TechSupportCallbackMap()
{
base.Cache.ReadWrite();
base.Not.LazyLoad();
base.Table("TS_CALLBACKS");
base.Id(x => x.ID, Fields.ID)
.GeneratedBy.Sequence("SEQ_TS_CALLBACKS");
base.References(x => x.Ticket)
.Column(Fields.TRACKED_ITEM_ID)
.Not.Nullable();
base.Map(x => x.TrackedItemID, Fields.TRACKED_ITEM_ID)
.Not.Insert()
.Not.Update()
.Generated.Always()
;
// ...
}
【问题讨论】:
标签: nhibernate properties projection icriteria