Nhibernate QueryOver的带有HasMany属性的SelectList

时间:2012-04-18 14:15:34

标签: nhibernate queryover

我在使用QueryOver的JoinAlias和ListList属性的SelectList在Nhibernate中构建投影时遇到问题。

我有域对象PageRic,它有IList属性PageHeaders:

    public class PageRic: AuditableLegacy
{
    public virtual string Ric { get; set; }
    public virtual McdDistId McdDistId {get; set; }
    public virtual IList<PageHeader> PageHeaders { get; set; }
    public virtual string Pointer { get; set; }
    public virtual bool Dup { get; set; }
    public virtual int Throttle { get; set; }
}

PageHeaders属性映射为HasMany:

        public class PageRicMapping : ClassMap<PageRic>
{
    public PageRicMapping()
    {
        Table("PAGE_RICS");
        Id(x => x.Ric, "RIC").Not.Nullable();

        References(x => x.McdDistId, "MCD_DIST_ID")
            .Not.LazyLoad()
            .Nullable();

        HasMany(x => x.PageHeaders)
            .KeyColumn("RIC")
            .Fetch.Subselect()
            .Inverse()
            .Cascade.AllDeleteOrphan()
            .Not.LazyLoad();

        Map(x => x.Pointer, "POINTER");
        Map(x => x.Dup, "DUP").Not.Nullable().CustomType<YesNoType>();
        Map(x => x.Throttle, "THROTTLE");
        }
}

执行此查询时:

            PageRicDTO pageRicDTO = null;
        McdDistId McdDistAlias = null;

        var results = Session.QueryOver<PageRic>()
            .JoinAlias(x => x.McdDistId, () => McdDistAlias)
            .SelectList(list => list
                                    .Select(x => McdDistAlias.Id).WithAlias(() => pageRicDTO.McdDistId)
                                    .Select(x => McdDistAlias.ShortName).WithAlias(() => pageRicDTO.McdDistName)
                                    .Select(x => x.Ric).WithAlias(() => pageRicDTO.Ric)
                                    .Select(x => x.Throttle).WithAlias(() => pageRicDTO.Throttle)                                        
                                    .Select(x => x.Rowstamps).WithAlias(() => pageRicDTO.Rowstamps)                                        
                                    .Select(x => x.PageHeaders).WithAlias(() => pageRicDTO.PageHeaders)
            )
            .TransformUsing(Transformers.AliasToBean<PageRicDTO>())
            .List<PageRicDTO>(); 

我得到IndexOutOfRangeException:索引超出了数组的范围。 这是我在日志文件中得到的内容:

2012-04-18 15:00:38,823 [CurrentAppDomainHost.ExecuteNodes] DEBUG NHibernate.SQL -     选择         mcddistali1_.MCD_DIST_ID为y0_,         mcddistali1_.SHORT_NAME为y1_,         this_.RIC为y2_,         this_.THROTTLE为y3_,         this_.ROWSTAMPS为y4_,         this_.RIC为y5_     从         PAGE_RICS this_     内部联接         MCD_DIST_IDS mcddistali1_             on this_.MCD_DIST_ID = mcddistali1_.MCD_DIST_ID

2012-04-18 15:00:39,306 [CurrentAppDomainHost.ExecuteNodes] WARN NHibernate.Util.ADOExceptionReporter - System.IndexOutOfRangeException:索引超出了数组的范围。    at NHibernate.Loader.Criteria.CriteriaLoader.GetResultColumnOrRow(Object [] row,IResultTransformer resultTransformer,IDataReader rs,ISessionImplementor session)    at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet,ISessionImplementor session,QueryParameters queryParameters,LockMode [] lockModeArray,EntityKey optionalObjectKey,IList hydratedObjects,EntityKey [] keys,Boolean returnProxies)    在NHibernate.Loader.Loader.DoQuery(ISessionImplementor session,QueryParameters queryParameters,Boolean returnProxies)    在NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session,QueryParameters queryParameters,Boolean returnProxies)    在NHibernate.Loader.Loader.DoList(ISessionImplementor session,QueryParameters queryParameters)

当我注释掉 .Select(x =&gt; x.PageHeaders).WithAlias(()=&gt; pageRicDTO.PageHeaders)时,我得到了DTO对象。

你能帮我找到解决这个问题的方法吗?

0 个答案:

没有答案