【发布时间】:2018-01-22 18:54:36
【问题描述】:
我在类别和产品之间有一对多的关系。 它们通过映射中的 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 在 DB 和我的子配置中为空:
References(x => x.Category).Column("CategoryId").Nullable();
这里的结果:
|-------|------|------------|
| Id | Name | CategoryId |
|-------|------|------------|
| 111 | p1 | NULL |
| 222 | p2 | NULL |
我希望孩子们被彻底消灭。我究竟做错了什么?请注意,我想保留父记录。
【问题讨论】:
-
你能试试这个吗? stackoverflow.com/a/11981259/194717
-
谢谢。它没有用。我尝试了两个: .Nullable 和 .Not.Nullable 记录不断出现。我认为 SaveUpdate() 至少需要使 categoryId 为空
-
您是否只是将 Products 集合设置为新实例?我相信你应该 .Remove() 项目或 .Clear() 集合,而不是让级联正常工作。
-
我希望 NHibernate 根据服务接收到的负载来处理删除。如果有效负载有一个 id = 0 的新项目,那么它会保存,当我发送具有填充 id 的相同对象时,它会更新。如果我不发送对象,它会删除等等
-
你是如何调用 NHibernate API 来执行删除的?能把执行delete语句的代码贴到数据库吗?
标签: c# fluent-nhibernate