如何在Fluent NHibernate中删除子项

3

我有一个类别和产品之间的一对多关系。它们通过映射中的categoryId字段链接在一起。类别记录永远不会被删除,但是其下的产品子项应该被删除。我通过json向我的服务发送不同的负载(基于逻辑)。我发送的产品数组长这样:

"products": [{Id=0, Name="p1"}]

它可以成功地添加,第二次也可以成功地添加:

"products": [{Id=111, Name="p1"},{Id=0, Name="p2"}]

这里数据库正确显示:

|-------|------|------------|
|  Id   | Name | CategoryId |
|-------|------|------------|
|  111  | p1   | 123        |
|  222  | p2   | 123        |

但是如果我发送的产品数组为空,我希望数据库中的两个产品记录都被删除:

"products": []

但是它们并没有。

这是我的NHibernate Fluent设置:

public CategoryMap()
{
    Table("Category");
    LazyLoad();

    Id(q => q.Id).GeneratedBy.Identity().Column("Id");

    HasMany(q => q.Products)
        .KeyColumn("CategoryId")
        .Cascade
        .AllDeleteOrphan()
        .Inverse();
}

在我的孩子身上:
public ProductMap()
{
    Table("Product");
    LazyLoad();

    Id(x => x.Id).Column("Id").GeneratedBy.Identity();

    Map(x => x.Name).Column("Name");

    References(x => x.Category).Column("CategoryId").Not.Nullable();
}

这里的结果:

|-------|------|------------|
|  Id   | Name | CategoryId |
|-------|------|------------|
|  111  | p1   | 123        |
|  222  | p2   | 123        |

我还尝试在数据库和子配置中将我的QuestionId设为可空:

References(x => x.Category).Column("CategoryId").Nullable();

这里是结果:
|-------|------|------------|
|  Id   | Name | CategoryId |
|-------|------|------------|
|  111  | p1   | NULL       |
|  222  | p2   | NULL       |

我希望孩子们完全被清除。我做错了什么?请注意,我想保留父记录。


1
你可以试试这个吗?https://dev59.com/v2865IYBdhLWcg3wCqDI#11981259 - Tony
谢谢。它没有起作用。我尝试了两种方式:.Nullable和.Not.Nullable,但记录仍然出现。我认为SaveUpdate()至少需要使categoryId为空。 - user1019042
我希望NHibernate根据服务收到的载荷来处理删除。如果有效载荷具有ID = 0的新项目,则保存该项目,当我发送具有填充ID的相同对象时,则进行更新。如果我不发送对象,则删除等等。 - user1019042
你是如何调用NHibernate API进行删除操作的?你能否发布执行删除语句到数据库的代码? - Ibn Masood
@jenson-button-event 谢谢。我没有问题将它们添加到集合中...真正的问题是如何从数据库中删除子项,而不是将它们保留在那里并使CategoryId为空。 - user1019042
显示剩余6条评论
1个回答

0

Clear 应该明确地这样做。仅仅替换数组是不够的。 此外,你应该在 Clear 之前加载它们(我注意到你设置了懒加载)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接