NHibernate拯救“中间人”与许多联想

时间:2010-10-26 17:50:14

标签: nhibernate fluent-nhibernate

我们有产品类别 ProductToCategory 类。

产品有很多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类,因为我们需要一个关于产品和类别之间关系的布尔属性来确定该产品是否应该出现在该类别的主页上。

所有这一切的映射都是使用Fluent NHibernate AutoMapping和一些覆盖

产品地图覆盖

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传递的那些,同时还更新其他产品属性,如名称,部件号等

当提供我的Product类实例时,确保NHibernate保存对产品(包括链接的ProductToCategories)的更改的最简洁方法是什么。

1 个答案:

答案 0 :(得分:0)

如果来自UI的产品实例与nhibernate会话没有关联但是是一个持久性实体(具有有效身份),则session.Merge(instance)session.SaveOrUpdateCopy(instance)应该这样做。他们将从数据库中获取此实体的副本,并在实例和数据库实例之间保存更改。