2010-10-26 19 views
0

我們有產品類別ProductToCategory類。NHibernate的節約「中間人」與有許多協會

A 產品有很多ProductToCategories,一個類別有很多ProductToCategories

產品包括該物業

public virtual IList<ProductToCategory> Categories { get; set; } 

ProductToCategory

public class ProductToCategory : Entity 
{   
    public virtual Product Product { get; set; }   
    public virtual Category Category { get; set; } 
    public virtual bool IsFeatured { get; set; } 
} 

類別包括這些屬性

public virtual Category Parent { get; set; } 
    public virtual IEnumerable<Category> Children { get; set; } 
    public virtual IEnumerable<ProductToCategory> Products { get; set; } 

我們需要一個顯式的ProductToCategory類,因爲我們需要關於產品和類別之間關係的布爾屬性來確定是否應該在該類別的主頁上顯示此產品。

映射所有這些都是使用功能NHibernate自動映射一些覆蓋

產品映射覆蓋

mapping.HasMany(x => x.Categories) 
    .Cascade.AllDeleteOrphan() 
    .Inverse(); 

類別映射覆蓋

mapping.HasMany(x => x.Children) 
    .Cascade.AllDeleteOrphan() 
    .KeyColumn("ParentId"); 

mapping.References(x => x.Parent).Column("ParentId"); 

產品類別映射覆蓋

mapping.References(x => x.Category); 

當我想保存一個產品,我需要NHibernate的刪除鏈接到該產品的任何現有ProductToCategories,並加入其中已經從UI穿過,同時還更新了其他產品性能如那些名稱,零件號等。

什麼是最簡潔的方式,以確保NHibernate在提供產品類的實例時保存對產品(包括鏈接的ProductToCategories)的更改。

回答

0

如果來自用戶界面的產品實例與nhibernate會話沒有關聯,但是是持久實體(具有有效標識),則session.Merge(instance)session.SaveOrUpdateCopy(instance)應該執行此操作。他們將從數據庫中獲取該實體的副本,並保存實例和數據庫實例之間的更改。