Search code examples
c#fluent-nhibernate

How to Delete children in Fluent NHibernate


I have one-to-many relationship between category and product. They are linked via categoryId field in the mapping. The category record will never get deleted, but the products children should get deleted. I send different payloads (based on logic) to my service via json. My product array I send one time is like this:

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

it adds it fine and then 2nd time adds it fine:

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

Here the DB properly shows:

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

But if I am sending empty array of products, I'm expecting that both product records in DB will be deleted:

"products": []

but they don't.

Here is my NHibernate Fluent setup:

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

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

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

and in my 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();
}

The result here:

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

I have also tried making my QuestionId nullable in DB and in my child configuration:

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

The result here:

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

I want the children to be completely wiped out. What am I doing wrong? Please note that I am want to keep the parent record.


Solution

  • Clear should explicitly do that. Simply replacing the array would not. Also you should load them before Clear (i notice you have lazy load set).