我想跟踪任何元素未包含的根对象列表。我希望以下伪代码可以工作:
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对象并代表它自己(与实体的集合属性相同的东西,仅在我的情况下我没有父实体)。如果集合属于实体,这种情况非常有效,在这种情况下,我可以在两个会话之间添加和删除项目。
非常感谢任何帮助。
答案 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除外)的伪实体。
我能想到的第三个选择是每次重新创建整个集合,这非常慢,如果其他实体引用其中一个项目则不起作用。
最后一种选择是自己重新实现脏检查功能,但这会增加一些复杂性和代码重复。
如果有人知道更好的选择,我会很高兴任何评论。