Многоуровневое каскадное удаление с однотипными объектами - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть следующие сущности в доменном проекте:

public class Parent {
    ...
    private Guid Id { get; private set; }

    private virtual Child Child { get; private set; }

    public void RemoveChild() {
        Child = null;
    }
    ...
}

public class Child {
    ...
    private Guid Id { get; private set; }

    private virtual Grandchild Grandchild1 { get; private set; }

    private virtual Grandchild Grandchild2 { get; private set; }
    ...
}

public class Grandchild {
    ...
    private Guid Id { get; private set; }
    ...
}

Можно ли настроить Context (подход с первым кодом) таким образом, чтобы, если я назначу null для Child в Parent, тогда сущности Child и Grandchildren будут быть удаленным из базы данных? Я пытался установить DeleteBehaviour.Cascade на Grandchild1Id и Grandchild2Id of Child, но SQL Сервер не позволяет каскадно удалять два одинаковых типа в сущности.

Я хочу этот сценарий:

(Parent entity) Child = null =>
(Parent table) ChildId = NULL =>
(Child table) Grandchild1Id = NULL, Grandchild2Id = NULL =>
(Grandchild table) Deletes rows with Grandchild1Id AND Grandchild2Id

1 Ответ

1 голос
/ 08 апреля 2020

Как насчет этого?

РЕДАКТИРОВАТЬ:

private void CascadeDelete(object item,DbContext dbContext)
{
    var props = item.GetType().GetProperties();
    foreach (var prop in props)
    {
        object value = prop.GetValue(item);
        if (prop.PropertyType.IsInterface && value != null)
        {
            foreach (var iItem in (System.Collections.IEnumerable)value)
            {
                CascadeDelete(iItem);
            }
        }

        dbContext.Entry(item).State = System.Data.Entity.EntityState.Deleted;
    }
}

Использование:

CascadeDelete(ParentObj, dbContext);
dbContext.SaveChanges();

Я использовал его раньше для каскадной вставки или обновления

string PK = "Id";
int id = (int)item.GetType().GetProperty(PK).GetValue(item); // int? be better
if (id == 0)
{
    dbContext.Entry(item).State = System.Data.Entity.EntityState.Added;
}
else
{
    dbContext.Entry(item).State = System.Data.Entity.EntityState.Modified;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...