如何在 Fluent NHibernate 中删除 children
How to Delete children in Fluent NHibernate
我在类别和产品之间有 one-to-many 关系。
它们通过映射中的 categoryId 字段链接。类别记录永远不会被删除,但产品 children 应该被删除。我通过 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();
}
在我的 child:
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 |
我还尝试在数据库和 child 配置中让我的 QuestionId 可以为空:
References(x => x.Category).Column("CategoryId").Nullable();
这里的结果:
|-------|------|------------|
| Id | Name | CategoryId |
|-------|------|------------|
| 111 | p1 | NULL |
| 222 | p2 | NULL |
我要child人彻底被消灭。我究竟做错了什么?请注意,我想保留 parent 记录。
Clear
应该明确地这样做。简单地替换阵列不会。
您还应该在 Clear
之前加载它们(我注意到您设置了延迟加载)。
我在类别和产品之间有 one-to-many 关系。 它们通过映射中的 categoryId 字段链接。类别记录永远不会被删除,但产品 children 应该被删除。我通过 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();
}
在我的 child:
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 |
我还尝试在数据库和 child 配置中让我的 QuestionId 可以为空:
References(x => x.Category).Column("CategoryId").Nullable();
这里的结果:
|-------|------|------------|
| Id | Name | CategoryId |
|-------|------|------------|
| 111 | p1 | NULL |
| 222 | p2 | NULL |
我要child人彻底被消灭。我究竟做错了什么?请注意,我想保留 parent 记录。
Clear
应该明确地这样做。简单地替换阵列不会。
您还应该在 Clear
之前加载它们(我注意到您设置了延迟加载)。