2010-05-26 68 views
1

我想跟踪任何元素未包含的根对象的列表。我想下面的伪代码工作:NHibernate:使用根对象的根集合

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); 
} 

这应该自动插入物品1和项目2,项目3删除和项目3和更新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 and FavoriteMovies是收藏夹类的唯一属性,属于IList和IList类型。我只想保留这两个集合属性,但不是收藏夹类。

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

任何帮助,非常感谢。

+1

要求它必须在会话间工作并不清楚你的问题。您应该将此(和其他隐藏的要求)添加到您的问题中,以避免人们花时间给一个不完整的问题提供无用的答案。 – 2010-05-26 20:44:11

回答

0

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

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

我能想到的第三种方法是每次重新创建整个集合,这很慢并且在其他实体引用其中一个项目时不起作用。

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

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

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(); 
    } 
} 
+0

但是,如果加载和保存发生在两个不同的会话中,并且在这些会话之间发生添加和删除,则这不起作用。 其实我想要一个IPersistentCollection对象跟踪添加和删除属于没有父实体并代表自己(发生在实体集合属性发生的相同的东西,只在我的情况下,我没有父实体)。如果集合属于一个实体,在这种情况下,我可以在两个会话之间添加和删除项目,这非常有效。 – Daniel 2010-05-26 20:06:39