2013-11-22 121 views
2

我花了數小時試圖弄清楚這一點,包括通過StackOverflow上所有以前提出的問題。nHibernate:無法解析屬性

我試圖從EvaluationHeadId的TrainingCourse查詢,這就是工作得很好,不過,我設法得到它返回TrainingRoute「無法解析屬性:TrainingRoute.TrainingRouteDefinition的:Model.Entities.TrainingCourse」

它保存完美,我真正的問題是查詢。

更新爲:

  using (var session = SessionProvider.Instance.OpenSession()) 
      { 
       using (var transaction = session.BeginTransaction()) 
       { 
        dto = session.QueryOver<TrainingCourse>() 
          .JoinQueryOver<EvaluationHead>(p => p.EvaluationHeads) 
          .JoinQueryOver<TrainingRoute>(p => p.TrainingRoute) 
          .Where(c => c.EvaluationHeadID == headId) 
          .SelectList(l => l 
           .Select(h => h.TrainingCourseDefn).WithAlias(() => d.TrainingCourseDefn) 
           .Select(h => h.IsAvailable).WithAlias(() => d.IsAvailable) 
           .Select(h => h.TrainingRoute.TrainingRouteDefinition).WithAlias(() => d.TrainingRouteDefinition)) 
          .TransformUsing(Transformers.AliasToBean<TrainingCourseDTO>()) 
          .List<TrainingCourseDTO>(); 

        transaction.Commit();   
       } 
      } 

映射:

 public TrainingCourseMap() 
    { 
     Id(x => x.TrainingCourseID).GeneratedBy.Identity(); 
     Map(x => x.TrainingCourseDefn); 
     Map(x => x.IsAvailable); 
     Map(x => x.TrainingCourseCreatedBy); 
     Map(x => x.TrainingCourseDtCreation); 
     Map(x => x.TrainingCourseDtModified); 
     Map(x => x.TrainingCourseModifiedBy); 

     References(x => x.TrainingRoute).Column("TrainingRouteID").Cascade.None(); 
     HasManyToMany(x => x.EvaluationHeads).Table("EvaluationTraining").ParentKeyColumn("TrainingCourseID").ChildKeyColumn("EvaluationHeadID").Inverse().Cascade.All(); 
    } 

 public EvaluationHeadMap() 
    { 
     Id(x => x.EvaluationHeadID).GeneratedBy.Identity(); 
     Map(x => x.ManagerID); 
     Map(x => x.SupervisorID); 
     Map(x => x.EvaluationStartPeriod); 
     Map(x => x.EvaluationEndPeriod); 
     Map(x => x.EmployeeScalePoint); 
     Map(x => x.KRASignature); 
     Map(x => x.KRASignatureDate); 
     Map(x => x.DateCreated); 
     Map(x => x.DateModified); 
     HasMany(x => x.KeyResultAreas).KeyColumn("EvaluationHeadID").Cascade.All().Inverse(); 
     HasMany(x => x.Evaluations).KeyColumn("EvaluationHeadID").Inverse().Cascade.All(); 

     HasManyToMany(x => x.TrainingCourses).Table("EvaluationTraining").ParentKeyColumn("EvaluationHeadID").ChildKeyColumn("TrainingCourseID").Cascade.All().AsBag(); 

     References(x => x.Stage).Column("StageID").Cascade.None(); 
     References(x => x.Employee).Column("EmployeeID").Cascade.None(); 
     References(x => x.Employment).Column("EmploymentID").Cascade.None(); 
     //References(x => x.Manager).Column("EmployeeID"); 
     //References(x => x.Supervisor).Column("EmployeeID"); 
    } 

public TrainingRouteMap() 
    { 
     Id(x => x.TrainingRouteID).GeneratedBy.Identity(); 
     Map(x => x.TrainingRouteDefinition); 
     Map(x => x.TrainingRouteDescription); 
     HasMany(x => x.TrainingCourses).KeyColumn("TrainingRouteID").Cascade.AllDeleteOrphan().Inverse(); 
    } 

注意:我在TrainingCourse和TrainingRoute之間有另一個查詢,它根本沒有問題,甚至通過TrainingCourse.TrainingRoute.x模式訪問屬性。與這一個唯一的區別是,我也在查詢其他表。

+0

向我們展示映射 – kaptan

+0

抱歉,我在很遠時刻(最後一刻),無法測試您的解決方案或提供映射。將盡快做到這一點。請與我一起裸露直到我做.....我試圖上傳它與我的問題,但被告知我需要更多的堆棧點來這樣做。正如你可以告訴我,這裏是相當新的......包括nhibernate – rommel

回答

3

TrainingRouteTrainingCourse(以及EvaluationHeads)的參考性質。所以你也必須使用JoinQueryOver或JoinAlias。下面我們將創建用於別名的虛擬對象(全部設置爲空)。我們也拆分查詢的加入,因爲它們導致引用到新創建的查詢

TrainingCourse trainingCourse = null; 
TrainingRoute trainingRoute = null; 
EvaluationHead evaluationHead = null; 

var query = session.QueryOver<TrainingCourse>(() => trainingCourse); 

// here we can work with criteria against the TrainingRoute 
var referenceToTraingRouteQuery = query 
    .JoinQueryOver<TrainingRoute>(p => p.TrainingRoute,() => trainingRoute); 

// here we can filter the EvaluationHead collection 
var referenceToEvaluationHeadQuery = query // here we start again from the base query 
    .JoinQueryOver<EvaluationHead>(p => p.EvaluationHeads,() => evaluationHead) 
    .Where(c => c.EvaluationHeadID == headId); 

dto = query 
    .SelectList(l => l 
     .Select(() => trainingCourse.TrainingCourseDefn) 
        .WithAlias(() => d.TrainingCourseDefn) 
     .Select(() => trainingCourse.IsAvailable) 
        .WithAlias(() => d.IsAvailable) 

     // now let's used join alias 
     .Select(() => trainingRoute.TrainingRouteDefinition) 
        .WithAlias(() => d.TrainingRouteDefinition)) 

    .TransformUsing(Transformers.AliasToBean<TrainingCourseDTO>()) 
    .List<TrainingCourseDTO>(); 

或者你可以使用JoinAlias,多看看這裏16.4. Associations

+0

對不起,我現在(最後一分鐘)不在,並且無法測試你的解決方案或提供映射。將盡快做到這一點。請與我一起裸露直到我做.....我試圖上傳它與我的問題,但被告知我需要更多的堆棧點來這樣做。正如你可以告訴我這裏很新...包括nhibernate – rommel

+0

我已經嘗試了另一個joinQueryOver,但是,它會在JoinQueryOver :: Delegate'System.Func >'不需要1個參數 – rommel

+0

您能否請求udpate問題並顯示代碼?我希望看到您所做的更改。我已經測試了我的建議場景,它對我來說是一個真正的祕密,它的工作原理是 –

相關問題