2010-10-26 53 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)应该执行此操作。他们将从数据库中获取该实体的副本,并保存实例和数据库实例之间的更改。