2011-04-18 59 views
0

我通過以下NHibernate的行爲感到困惑:
域類和映射:NHibernate的 - 延遲加載:沒有會話或會話關閉

public class Category 
{ 
    public virtual int ID { get; set; } 
    public virtual string Name { get; set; } 

    private IList<Product> _products; 
    public virtual IList<Product> Products 
    { 
     get { return new List<Product>(_products).AsReadOnly(); } 
    } 

    public Category() 
    { 
     _products = new List<Product>(); 
    } 
} 
public class Product 
{ 
    public virtual int ID { get; set; } 
    public virtual string Name { get; set; } 
    public virtual Category Category { get;set; } 
} 
public class ProductMap : ClassMap<Product> 
{ 
    public ProductMap() 
    { 
     Schema("dbo"); 
     Table("tProducts"); 

     Id(x => x.ID); 
     Map(x => x.Name); 
     References(x => x.Category).Column("CategoryID"); 
    } 
} 
public class CategoryMap : ClassMap<Category> 
{ 
    public CategoryMap() 
    { 
     Schema("dbo"); 
     Table("tCategories"); 

     Id(x => x.ID); 
     Map(x => x.Name); 
     HasMany(x => x.Products) 
      .KeyColumn("CategoryID") 
      .Access.CamelCaseField(Prefix.Underscore) 
      .Inverse() 
      .Cascade.All(); 
    } 
} 

代碼造成麻煩:

Category category; 

    using (var session = sessionFactory.OpenSession()) 
    { 
     category = session.Get<Category>(1); 
    } 

    using (var session = sessionFactory.OpenSession()) 
    { 
     var products = category.Products; // exception 
    } 

爲什麼當我試圖獲得產品時,我沒有得到會話異常嗎?我在這裏有一個會議!如何避免這種異常(我更喜歡2個會話在這裏,我想繼續加載懶惰)?
在此先感謝!

+1

您用於檢索cathegory對象的會話已關閉,因此當您試圖訪問products屬性時,它無法訪問它。 您可以從原始會話中分離導尿管對象並將其附加到已打開的新會話中,但我認爲這似乎不是一個好主意。你爲什麼想要使用不同的會話? – Paul 2011-04-18 12:41:01

+0

爲了顯示問題所在,本示例顯着簡化。在實際的應用程序中,我有幾個函數來檢索對象。我只是不想將會話傳遞給他們每個人。 – StuffHappens 2011-04-18 12:45:44

+1

不應該成爲「類別」嗎? ;) – AGuyCalledGerald 2011-04-18 13:00:38

回答

1

我得到了這個相同的錯誤,這是由於WPF用戶界面在我點擊對數據進行刷新調用的「刷新」按鈕之後,保留了舊的nhibernate會話中對象的引用上下文關聯會話中的所有緩存對象。

我需要確保「NotifyChange」被觸發以使UI更新(並且UI正在監聽它)。

相關問題