加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读