c# – NHibernate:在集合上调用.RemoveAll
发布时间:2020-12-16 01:50:49 所属栏目:百科 来源:网络整理
导读:我有一个问题是在通过NHibernate检索集合时无法使用.RemoveAll. 我有一个名为Order的实体,我通过NHibernate持久化. 订单有很多OrderItems.这是我对这种关系的映射: mapping.HasMany(o = o.Items) .Cascade.AllDeleteOrphan() .AsList() .Inverse(); 在我的
我有一个问题是在通过NHibernate检索集合时无法使用.RemoveAll.
我有一个名为Order的实体,我通过NHibernate持久化. 订单有很多OrderItems.这是我对这种关系的映射: mapping.HasMany(o => o.Items) .Cascade.AllDeleteOrphan() .AsList() .Inverse(); 在我的域中看起来像这样: public virtual IList<OrderItem> Items { get; set; } 据我了解,我必须使用IList,因为NHibernate拥有自己的List实现. 现在我想在Order类中使用此方法从我的订单中删除一个项目: public virtual void RemoveItem(string variantSku) { items.RemoveAll(x => x.Variant.VariantSku == variantSku); } 它不起作用,因为IList没有这种方法. 我试过了: items.ToList().RemoveAll(x => x.Variant.VariantSku == variantSku); 但这似乎不起作用.我意识到items.ToList()实际上创建了原始列表的副本,所以我想我可以尝试: var itemsList = items.ToList(); itemsList.RemoveAll(...) 但是它仍然通过NHibernate持续存在吗? 我的问题:我可以在这种情况下实际使用.RemoveAll,还是应该考虑一种不同的删除项目的方法? 解决方法
您将集合映射为关系的反面,因此除了从集合中删除项目之外,您还必须在OrderItem端取消对Order的引用.因此,RemoveAll方法或扩展方法将无法完成此任务.
我会像这样处理它: public virtual void RemoveItem(string variantSku) { var itemsToRemove = items.Where(x => x.Variant.VariantSku == variantSku).ToArray(); foreach(var item in itemsToRemove) { item.Order = null; items.Remove(item); } } 我还建议使用set而不是bag mapping. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |