1

나는 다른 개체에서 오는 속성에 의해 데시벨에서 오브젝트를 필터링 할하지만 난 예외가 얻을 :(유창한) nhibernate에서 QueryOver로 선택을 제한하는 방법?

유형 'System.Collections.Generic.KeyNotFoundException'의 첫 번째 예외가가 mscorlib.dll에서 발생했습니다
형의 첫 번째 예외 'NHibernate.QueryException는'형태의 첫 번째 예외 'NHibernate.QueryException가'NHibernate.dll
프로그램 "[5116] Examples.FirstProject.vshost 발생 NHibernate.dll
발생. exe : Managed (v2.0.50727) '코드 -532459699 (0xe0434f4d)로 종료되었습니다.

이 작동 :

var curves = session.QueryOver<Curve>().WhereRestrictionOn(p => p.Group.Name).IsLike("%GroupName%").List(); 
foreach (Curve curve in curves) 
{ 
    Console.WriteLine(" ID:\t{0}\n Name:\t{1}\n Group:\t{2}\n", curve.Id, curve.Name, curve.Group.Name); 
} 

이 내 매핑은 다음과 같습니다 :

public class CurveMap : ClassMap<Curve> 
{ 
    public CurveMap() 
    { 
     Table("CURVES"); 
     Id(x => x.Id).Column("CURVE_ID"); 
     Map(x => x.Name).Column("NAME"); 
     References(x => x.Group).Column("GROUP_ID"); 
    } 
} 

public class CurveGroupMap : ClassMap<CurveGroup> 
{ 
    public CurveGroupMap() 
    { 
     Table("GROUPS"); 
     Id(x => x.Id).Column("GROUP_ID"); 
     Map(x => x.Name).Column("NAME"); 
     HasMany(x => x.Curves).KeyColumn("GROUP_ID").Cascade.All().Inverse(); 
    } 
} 

그리고 이러한 내 개체

입니다

var curves = session.QueryOver<Curve>().WhereRestrictionOn(p => p.Name).IsLike("%CurveName%").List(); 
foreach (Curve curve in curves) 
{ 
    Console.WriteLine(" ID:\t{0}\n Name:\t{1}\n Group:\t{2}\n", curve.Id, curve.Name, curve.Group.Name); 
} 

이 아니, 그것은 예외 정보를 출력

public class Curve 
{ 
    public virtual int Id { get; private set; } 
    public virtual string Name { get; set; } 
    public virtual CurveGroup Group { get; set; } 
} 

public class CurveGroup 
{ 
    public virtual int Id { get; private set; } 
    public virtual string Name { get; set; } 
    public virtual IList<Curve> Curves { get; set; } 
} 

어떤 문제를 해결하는 방법. 나는 새로운 (능숙) nhibernate입니다.

CurveGroup cgAlias = null; 
var curves = session.QueryOver<Curve>() 
    .JoinAlias(e => e.Group,() => cgAlias) 
    .WhereRestrictionOn(() => cgAlias.Name).IsLike("%GroupName%").List(); 

답변

2

가 작동합니다. 이것을 달성하기위한보다 쉬운 방법이 있는가? 왜 이런 식으로해야 하는가? 당신은 당신의 대답을 정교하게 그리고 더 많은 세부 사항을 줄 수 있습니까?
+0

작품,하지만 뒤얽힌 것 같다 : 당신이 CurveGroup에 가입하고 별칭을 사용하는 경우 – mrt181

+1

@ mrt181 디자인 상으로는 QueryOver가 자체적으로 연결 경로를 탐색하지 않는 것으로 보입니다. 쿼리에서 명시 적으로 지정해야합니다. 연관 경로가 지정되지 않은 경우 "특성을 분석 할 수 없음"예외가 발생합니다. (JoinAlias와 JoinQueryOver에 대한 자세한 내용은 [here] (http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx#Associations)를 참조하십시오. '. –

+0

고마워, 잘 알고있어. – mrt181

관련 문제