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

标签 c# nhibernate fluent-nhibernate

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

相关文章:

c# - 帖子 : OnMethodBoundaryAspect and WebMethod

c# - 在自托管 ASP.NET Core 微服务中启动多个后台线程

nhibernate - 无法解析属性 : Id

mysql - 如何关闭 NHibernate 连接?

c# - Fluent Nhibernate - 如何指定表名

nhibernate - Fluent NHibernate 共享列的组件

c# - 试图理解什么是表达式树

C# 和 excel cubefield 项目列表

c# - 在 NHibernate 中设置超时过期

fluent-nhibernate - 带公式的多对一