NHibernate:具有根对象的根集合

时间:2010-05-26 16:20:37

标签: nhibernate collections root aggregateroot

我想跟踪任何元素未包含的根对象列表。我希望以下伪代码可以工作:

using (session1 = [...]) {
  IList<FavoriteItem>list = session1.Linq<FavoriteItem>().ToList();
}

list.Add(item1);
list.Add(item2);
list.Remove(item3);
list.Remove(item4);
var item5 = list.First(i => i.Name = "Foo");
item5.Name = "Bar";

using (session2 = [...]) {
  session2.Save(list);
}

这应该自动插入item1和item2,删除item3和item3并更新item5(即我不想分别为所有项目调用sesssion.SaveOrUpdate()。

是否可以定义与表无关的伪实体?例如,我想定义类的收藏夹并映射它的2个集合属性,而不是我想编写这样的代码:

using (session1 = [...]) {
   var favs = session1.Linq<Favorites>();
}
favs.FavoriteColors.Add(new FavoriteColor(...));
favs.FavoriteMovies.Add(new FavoriteMovie(...));

 using (session2 = [...]) {
  session.SaveOrUpdate(favs);  
}

FavoriteColors和FavoriteMovies是Favorites类的唯一属性,属于IList和IList类型。我只想坚持这两个集合属性,而不是持久化类。

实际上我想要一个跟踪添加和删除属于没有父实体的IPersistentCollection对象并代表它自己(与实体的集合属性相同的东西,仅在我的情况下我没有父实体)。如果集合属于实体,这种情况非常有效,在这种情况下,我可以在两个会话之间添加和删除项目。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

比伪实体更简单的解决方案是将列表包装在管理所需事物的对象中。

public class FavoriteList : IEnumerable
{
  private List<FavoriteItem> list;
  private ISession session;
  public FavoriteList(ISession session) 
  {
    list = session.Linq<FavoriteItem>().ToList();
    this.session = session;
  }

  public void Add(FavoriteItem item)
  {
    session.SaveOrUpdate(item); 
    list.Add(item);
  }

  public void Remove(FavoriteItem item)
  {
     session.Delete(item); //or something like that
     list.Remove(item);
  }

  public IEnumerator GetEnumerator()
  {
     return (list as IEnumerable).GetEnumerator();
  }
}

答案 1 :(得分:0)

我还没有找到解决这个问题的真正方法。到目前为止,我的工作是将集合作为子集合属性添加到另一个实体,到目前为止只存在一个实例。但是,如果该实体将有更多实例,则此解决方案会中断,并且其缺点是每次添加或删除项目时其版本都会增加。

另一种解决方法是创建一个没有属性/列(ID除外)的伪实体。

我能想到的第三个选择是每次重新创建整个集合,这非常慢,如果其他实体引用其中一个项目则不起作用。

最后一种选择是自己重新实现脏检查功能,但这会增加一些复杂性和代码重复。

如果有人知道更好的选择,我会很高兴任何评论。

相关问题