流暢NHibernateの内部には、参加します

私は3つのテーブル(マスター、イメージング、リネア)を持っていた:

Master
public virtual int Id { get; private set; }
public virtual Imagen imagen { get; set; }

Imagen
public virtual int Id { get; private set; }
public virtual Linea linea { get; set; }

Linea
public virtual int Id { get; private set; }
public virtual String Nombre { get; set; }

私はこのようなクエリが必要です:

SELECT * FROM dbo.Master 
INNER JOIN dbo.Imagen ON dbo.Master.imagen_id = dbo.Imagen.Id 
INNER JOIN dbo.Linea ON dbo.Imagen.linea_id = dbo.Linea.Id 
WHERE dbo.Linea_Id = 5

しかし、Fluent Nhibernateにオートマッパーを使ってこのクエリを作成する方法を知らない。 これまで私はこれを試した:

ICriteria c = session.CreateCriteria(typeof(Master))
  .CreateAlias("dbo.Imagen", "img", JoinType.InnerJoin)
  .Add(Restrictions.Eq("img.linea_id", id_linea));

return c.List();

しかし、私はこのエラーが発生します: プロパティを解決できませんでした:のdbo:ImageManager.Model.Entity.Master

Inner Joinのやり方に関するアイデアはありますか? 前もって感謝します

3

2 答え

私は最初からdbo.Imagenからdboを取り除くだろう。 ICriteriaインターフェイスを使用すると、オブジェクトをテーブルにマッピングしたり、プロパティを列に1対1でマッピングしたりすることができますが、データベーステーブルではなくオブジェクトの観点から考える必要があります。

EDIT:
another option would be to use the QueryOver Lambda syntax.

   var list = session.QueryOver()
                        .JoinQueryOver(master => master.imagen)
                        .Where(imagen => imagen.linea.Id == 5)
                        .List();
8
追加された
それは残念です...自分でもQueryOverの構文を学習しています。修正されます。
追加された 著者 Nathan Fisher,
一定。私はこれをテストしました。今はうまくいくはずです。
追加された 著者 Nathan Fisher,
ありがとう、Alredyはそれをしました。 Fluent Nhibernateには本当に新しいImです。
追加された 著者 lloiacono,
私はこれを試しましたが、このエラーが発生します: "プロパティを解決できませんでした:imagen.linea.Id of:ImageManager.Model.Entity.Master"私はまた、.Where(Master => Master.imagen.linea.Id == 5 )しかし、私は同じエラーを取得
追加された 著者 lloiacono,
それは動作します!!!、ありがとう。とにかく私はICriteriaを使用して画像とラインを取得する必要があったので、そのマスターに関連する画像を取得する必要がありました。なぜなら、imagenとhddのcreatealiasを追加した理由は、画像やHDDのプロパティにアクセスしようとするとLazyLoadException私のマスターオブジェクト。
追加された 著者 lloiacono,
ICriteria c = session.CreateCriteria(typeof(MasterHdd)).CreateAlias( "imagen"、 "JoinType.InnerJoin).CreateAlias(" hdd "、" h "、JoinType.InnerJoin).CreateAlias(" "img.linea"、 "lin"、JoinType.InnerJoin).Add(Restrictions.Eq( "lin.Id"、id_linea));戻り値c.List ();
追加された 著者 lloiacono,

私はすでにあなたがそれを修正している場合は私の前のコメントからうまくいっていないが、私は

ICriteria c = session.CreateCriteria(typeof(Master))

.CreateAlias("imagen", "img", JoinType.InnerJoin)
.CreateAlias("img.linea", "lin", JoinType.InnerJoin)
.Add(Restrictions.Eq("lin.Id", 5));

return c.List();

編集:以下に述べるようにケーシングが変更されました。

3
追加された
あなたが受け取ったエラーメッセージは何ですか?
追加された 著者 fluent,
良い点。私の答えでケーシングが変わった。
追加された 著者 fluent,
この回答の唯一の問題は、オブジェクト参照の場合です。あなたはImagenを持っています。@ lloiaconoはオブジェクト参照がすべて小文字の - imagenです。リネア参照は同じになります。それがうまくいかない理由かもしれません。
追加された 著者 Nathan Fisher,
今の数年前のstephen bohlenのnhibernateシリーズの夏を見てみましょう。しかし、基本はICriteriaとnhibernateの一般的な存在です。また、 funnelweblog.com を見てください。流暢なnhibernateに基づいたオープンソースのブログプラットフォームです
追加された 著者 Nathan Fisher,
ありがとう、私は現在これに取り組んでいます。問題はそれが動作していないということです。これは私が得るエラーです: "Imager of:Imager of:ImageManager.Model.Entity.Master"私はAutomappingを使ってモデルフォルダの下のすべてをマッピングしています:.Mappings(m => m.AutoMappings.Add(model)))モデルフォルダには、Entityというサブフォルダがあり、そこにはエンティティがあります。
追加された 著者 lloiacono,
パブリッククラスMaster {public virtual int Id {get;プライベートセット; }パブリックバーチャルImagen imagen {get;セット; }パブリックバーチャルHdd hdd {get;セット; }パブリック仮想文字列hash_master {get;セット; }}
追加された 著者 lloiacono,
パブリッククラスLinea {public virtual int Id {get;プライベートセット; }パブリック仮想int ObjVersion {get;}セット; } public仮想ストリングNombre {get;セット; }パブリック仮想String Tabla {get;セット; }パブリックバーチャルString NombreCorto {get;セット; }}パブリッククラスImagen {パブリック仮想int Id {get;プライベートセット; }パブリック仮想String PartNumber {get;}セット; }パブリックバーチャルストリングバージョン{get;セット; } public virtual Stringしたがって{get;セット; }パブリックバーチャルストリーミングリビジョン{get;セット; }パブリックバーチャルLinea linea {get;セット; } public仮想ストリングNombre {get;セット; }}
追加された 著者 lloiacono,
本当に問題だったありがとう@ NathanFisher。私はもうエラーは表示されません。流暢なマニュアルをお勧めしますか?私はwikiを読んでいますが、Icriteriaについては何も見つかりません。
追加された 著者 lloiacono,