1

我有以下類和關聯的映射(功能NHibernate):NHibernate的不加載子對象

public class Category 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 
    public virtual Category ParentCategory { get; set; } 
    public virtual IList<Category> ChildCategories { get; set; } 
} 

映射:

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(); 
    } 
} 

我創建了兩個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 Id但其ChildCategories屬性是nullCategory對象。

我做錯了什麼?

PS: - 這是我的第一個實驗NHibernate等與Fluent NHibernate

編輯: -下面的東西的工作。我需要關閉會議,然後再次打開閱讀。否則,它只是從內存中讀取,因爲@Holf指出我需要添加Child CategoryCategory如:

c.ChilCategories.Add(cc);

我只是做了如下:

+0

'Fetch.Select()'只是在黑暗中拍攝,如果你改變它沒有工作:( – TheVillageIdiot

+0

會發生什麼'session.Load (1)''到session.Get (1)'? – Rippo

+0

@TheVillageIdiot非常感謝這個,我很驚訝我之前沒有遇到過這個問題(雖然以前可能會被黑客入侵),但重新開放會話完全可以解決這個問題 –

回答

0

雖然你已經處理的關係的一個側面,通過分配「C」爲「CC」的ParentCategory,我看不到任何地方,你」我做了相反的事情。 我想你也需要做

c.ChildCategories.Add(CC);

在執行SaveOrUpdate之前。

+0

我不認爲這很重要,或者即使我需要這樣做,因爲'ChildCategories'和'ParentCategory'在Map中使用相同的列'ParentCategoryId'進行映射。 – TheVillageIdiot

+0

這絕對是重要的,Map是告訴nHibernate如何將對象圖映射到相應的數據庫模式。即使有了這個映射,nHibernate仍然只會持續它給出的東西。如果你還沒有把孩子添加到paren在繼續之前收集數據,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(); 
    } 
} 

你也不能肯定的是,Id與價值1指父類,使用LINQ提供程序加載正確的對象。

+0

我會嘗試修改我的地圖。但是我確定'Id = 1',因爲表中只有兩條記錄。 'Id = 2'的人有'ParentCategoryId = 1' – TheVillageIdiot

相關問題