gpt4 book ai didi

c# - NHibernate:在集合上调用 .RemoveAll

转载 作者:行者123 更新时间:2023-11-30 14:15:51 24 4
gpt4 key购买 nike

在通过 NHibernate 检索集合时,我遇到了无法使用 .RemoveAll 的问题。

我有一个名为 Order 的实体,我通过 NHibernate 保留它。

Order 有很多 OrderItems。这是我对这种关系的映射:

mapping.HasMany(o => o.Items)
.Cascade.AllDeleteOrphan()
.AsList()
.Inverse();

在我的域中看起来像这样:

public virtual IList<OrderItem> Items { get; set; }

据我所知,我必须使用 IList 因为 NHibernate 有它自己的 List 实现。

现在我想在我的 Order 类中使用此方法从我的 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);
}
}

我还建议使用集合而不是包映射。

关于c# - NHibernate:在集合上调用 .RemoveAll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9032561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com