Добавить каскадное удаление для всех вложенных дочерних элементов в цепочке иерархии - PullRequest
0 голосов
/ 19 февраля 2019

Я хотел бы получить следующее поведение: при удалении объекта с родительского уровня первого уровня все сущности «потомок» удалялись автоматически, скажем, у меня есть класс библиотеки, в котором есть список «областей», каждая область имеетсписок «коридоров», и каждый коридор имеет список «рангов», каждый ранг имеет список книг.Вы поняли, что уровень понижается?

Схематическая модель:

Library 
-----> Area
----------> Corridors
---------------> Ranks
--------------------> Book

Классы:

class Library {
    public int Id {get;set;}
    public List<Area> Areas {get;set;}
}

class Area {
    public int Id {get;set;}
    public Library Library {get;set;}
    public List<Corridor> Corridors {get;set;}
}

class Corridor {
    public int Id {get;set;}
    public Area Area {get;set;}
    public List<Rank> Ranks {get;set;}
}

class Rank {
    public int Id {get;set;}
    public Corridor Corridor {get;set;}
    public List<Book> Books {get;set;}
}

class Book {
    public int Id {get;set;}
    public Rank Rank {get;set;}
    public string Name {get;set;}
}

Я хотел бы, чтобы, когда я стер библиотеку, я стерла детей, которые были нужны в цепочке, каскаде.Я могу сделать это с помощью следующего кода, я сделал все мои классы наследуемыми от общего класса, который я назвал «Registry», и у всех них было общее свойство с именем «Library», и я настроил его следующим образом:

modelBuilder.Model.GetEntityTypes()
    .Where(t => typeof(Registry).IsAssignableFrom(t.ClrType))
    .ToList()
    .ForEach(prop =>
    {
        modelBuilder
        .Entity(prop.Name)
        .HasOne(typeof(Library), "Library")
        .WithMany()
        .OnDelete(DeleteBehavior.Cascade);
    });

Я протестировал с 20 классами и запустил в созданной миграции все 20 сущностей, имеющих FK, указывающий на Library , называемый "LibraryId" и ссвойство, "onDelete: ReferentialAction.Cascade" , но у меня есть структура с 650 классами, совершенно нецелесообразно наследовать их все от класса Registry , я думаю, что следуетбыть более простым и эффективным способом, но я не знаю, как это сделать ...

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019
class Library {
public int Id {get;set;}
public List<Area> Areas {get;set;}
}

class Area {
public int Id {get;set;}
public Library Library {get;set;}
public int LibraryId {get;set;}
public List<Corridor> Corridors {get;set;}
}

class Corridor {
public int Id {get;set;}
public Area Area {get;set;}
public int AreaId {get;set;}
public List<Rank> Ranks {get;set;}
}

class Rank {
public int Id {get;set;}
public Corridor Corridor {get;set;}
public int CorridorId {get;set;}
public List<Book> Books {get;set;}
}

class Book {
public int Id {get;set;}
public Rank Rank {get;set;}
public int RankId {get;set;}
public string Name {get;set;}
}

Добавление RankId к классу книги заставляет EF использовать ondelete: cascade для Book и Rank.Это относится и к другим классам

0 голосов
/ 19 февраля 2019

Для обязательных отношений (ненулевой внешний ключ) невозможно сохранить нулевое значение внешнего ключа, поэтому по умолчанию используется каскадное удаление.

Вы можете просто создать иерархию:

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

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

    public Guid ParentId {get;set;}
    public Parent Parent {get;set;}
}

И ядро ​​Ef знает, что дочерние элементы должны быть удалены с помощью Parent, поскольку ParentId обязателен.Прочитайте Док для более подробной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...