2010-05-26 82 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

相關問題