1

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

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 对象来跟踪不属于父实体并代表自身的添加和删除(与实体的集合属性发生的事情相同,仅在我的情况下我没有父实体)。如果集合属于一个实体,这非常有效,在这种情况下,我可以在两个会话之间添加和删除项目。

任何帮助深表感谢。

4

2 回答 2

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();
  }
}
于 2010-05-26T18:22:35.853 回答
0

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

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

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

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

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

于 2010-06-03T17:29:29.150 回答