在通过 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/