2016-06-28 10 views
0

私は新しいNHibernateクエリーです。私は以下に述べたように、1対1の関係を持つOracleテーブルを持っています。私は流暢なnhibernateマッピングを行い、以下のクエリを実行しようとしていますが、ChInfo_Idが有効でないというエラーが表示され続けます。誰でも私がここで間違っていることを助けることができますか?C#Nhibernateクエリーオーバーに1対多に参加する方法

var query = Session.QueryOver(() => logAlias) 
        .Inner.JoinQueryOver(()=>logAlias.ChInfo,()=>chInfoAlias) 
        .Where(()=>logAlias.RegDate.IsBetween(fromDate).And(toDate)) 
        .Future<Log>(); 

    return query.ToList(); 

テーブル:

Ch_Info

Ch_no 
Name 

ログイン

portid 
regdate 
ch_no 

クラスとFluentNHibernateマップ:

public class Log 
{ 
    public virtual int PortId { get; set; } 
    public virtual DateTime Regdate { get; set; } 
    public virtual ChInfo ChInfo { get; set; } 
} 

public class ChInfo 
{ 
    public ChInfo() 
    { 
     Logs = new List<Log>(); 
    } 

    public virtual string Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual IList<Log> Logs { get; set; }   
} 

public class LogMap : ClassMap<Log> 
{ 
    public LogMap() 
    { 
     Table("LOG"); 

     CompositeId() 
      .KeyProperty(x => x.PortId,"portid") 
      .KeyProperty(x => x.Regdate, "regdate"); 

     References(x => x.ChInfo); 
    } 
} 
public class ChInfoMap : ClassMap<ChInfo> 
{ 
    public ChInfoMap() 
    { 
     Table("Ch_Info"); 

     Id(x => x.Id).GeneratedBy.Assigned().Column("Ch_no"); 
     Map(x => x.Name).Column("Name"); 
     HasMany(x => x.Logs) 
      .Inverse() 
      .Cascade.All(); 
    } 
} 

答えて

0

LogMap内の参照に列名を指定して解決しました。

public class LogMap : ClassMap<Log> 
{ 
    public LogMap() 
    { 
     Table("LOG"); 

     CompositeId() 
      .KeyProperty(x => x.PortId,"portid") 
      .KeyProperty(x => x.Regdate, "regdate"); 

     References(x => x.ChInfo).Columne("Ch_no"); 
    } 
} 
+0

私は双方向関連の両側に列名を指定します。ところで、複合キーは避けてください。彼らはアンチパターンであり、レガシーデータベースに対処するためにNHibernateによってのみサポートされています。 –

関連する問題