1

オブジェクトNHibernateはロードしない子供は、私は、クラスと関連マッピング(流暢NHibernateは)下記た

public class CategoryMap : ClassMap<Category> 
{ 
    public CategoryMap() 
    { 
     Table("Categories"); 

     Id(x => x.Id).Column("Id").CustomType("Int32").Access.Property() 
     .CustomSqlType("int").Not.Nullable().Precision(10) 
     .GeneratedBy.Identity(); 

     Map(x => x.Description).Column("Description").Nullable() 
     .Generated.Never().CustomType(typeof (string)).Access 
     .Property().Length(250); 

     Map(x => x.Name).Not.Nullable().Generated.Never().CustomType("string") 
     .Access.Property().Column("Name").Length(50); 

     References(x => x.ParentCategory).Column("ParentCategoryId"); 
     HasMany(x => x.ChildCategories).KeyColumn("ParentCategoryId").Inverse() 
     .AsBag().Fetch.Select(); 
    } 
} 

次のように私は2つのCategoryオブジェクトを作成する:

var c = new Category 
     { 
      Name = "Ebooks", 
      Description = "Contains awz, mobi, pdf, epub and other 
       electronic books" 
     }; 
var cc = new Category 
     { 
      Name = "Kindle Books", 
      Description = "Contains Kindle ebook reader format books 
        (awz, mobi)", 
      ParentCategory = c 
     }; 
session.SaveOrUpdate(c); 
session.SaveOrUpdate(cc); 

保存されたオブジェクトにアクセスしようとすると:

var c = session.Load<Category>(1); 
var cc = c.ChildCategories; 

c 1のIdCategoryオブジェクトを含むが、そのChildCategoriesプロパティがnullあります。

私は間違っていますか?

PS:これはNHibernateの最初の実験で、Fluent NHibernateとなります。

編集: -次のようなことが働いた。私は読書のために再び開く前に、セッションを閉じる必要がありました。さもなければ、@ Holfが私がCategoryのようにChild Categoryを追加する必要があることを指摘したように、メモリナッドからただ読んでいます:

c.ChilCategories.Add(cc);

+0

'Fetch.Select()' (1) '(1)'? – TheVillageIdiot

+0

をあなたが変更した場合、暗闇の中でだけでショットです私は以前にこの問題に遭遇していなかったことに驚いたが(過去にハッキングしているかもしれないが)、セッションを再開するとそれは完全に解決する – Rippo

+0

session.Get 'に'たSession.loadそれは動作しませんでした:(どうなり –

答えて

0

あなたは「CC」のParentCategoryとして「C」を割り当てることによって、関係の片側を扱ってきましたが、私はそのあなたの」どこでも見ることができないを次のように私はやった

逆を行った。 あなたもする必要があると思います

c.ChildCategories.Add(cc); SaveOrUpdateを実行する前に

を入力してください。

+0

これは重要ではないと思う私は 'ChildCategories'と' ParentCategory'の両方がMapの 'ParentCategoryId'を使ってマップされているので、これを行う必要があります。 – TheVillageIdiot

+0

Mapはすべて、オブジェクトグラフを対応するデータベーススキーマにマップする方法をnHibernateに伝えます。このマッピングでも、nHibernateはそれが与えられたものだけを保持します。子をparenに追加していない場合tコレクションを永続化する前に、nHibernateはあなたのためにこれを行いません。 – Holf

0

次のマップを更新することができますに:

public class CategoryMap : ClassMap<Category> 
{ 
    public CategoryMap() 
    { 
     Table("Categories"); 

     Id(x => x.Id).Column("Id").CustomType("Int32").Access.Property() 
     .CustomSqlType("int").Not.Nullable().Precision(10) 
     .GeneratedBy.Identity(); 

     Map(x => x.Description).Column("Description").Nullable() 
     .Generated.Never().CustomType(typeof (string)).Access 
     .Property().Length(250); 

     Map(x => x.Name).Not.Nullable().Generated.Never().CustomType("string") 
     .Access.Property().Column("Name").Length(50); 

     References(x => x.ParentCategory).Column("ParentCategoryId"); 
     HasMany(x => x.ChildCategories).KeyColumn("ParentCategoryId").Inverse() 
     .Cascade.All(); 
    } 
} 

また、あなたは正しいオブジェクトをロードするためにLINQプロバイダを使用し、値1Idは、親カテゴリを指していることを確認することはできません。

+0

私は自分のマップを修正しようとします。しかし、テーブルには2つのレコードしかないので、 'Id = 1'については確信しています。 'Id = 2'のものは' ParentCategoryId = 1'を持っています – TheVillageIdiot