Установить каскадное удаление для всех объектов - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь настроить DeleteBehavior для всех моих сущностей.Окончательный результат заключается в том, что я могу просто запустить:

DELETE FROM Companies Where Id = '1'

И все мои 800 таблиц будут очищены каскадно (Все ссылки на таблицы CompanyId как FK ) ...

Мои классы

public interface ITest
{
    string PropX { get; set; }
    Company Company { get; set; }
}

public abstract class Reg {
    public int Id { get; set; }
    public Company Company { get; set; }
}

public class Company {
    public int Id { get; set; }
    public string Name { get; set; }
}


public class Test : Reg, ITest
{
    public string Prop1 { get; set; }
    public string PropABC { get; set; }
    public string PropX { get; set; } = "My Info";
}

public class Test2 : Reg, ITest
{
    public string PropEFG { get; set; }
    public string PropX { get; set; } = "My Info2";
}

public class Test3 : Reg, ITest
{
    public string PropExample { get; set; }
    public string PropX { get; set; } = "My Info3";
}

Если я это сделаю, то отлично работает:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<Test>().HasOne(p=>p.Company).WithMany().OnDelete(DeleteBehavior.Cascade);
    modelBuilder.Entity<Test2>().HasOne(p=>p.Company).WithMany().OnDelete(DeleteBehavior.Cascade);
    //....... not for 800 classes

 }

Но у меня 800 классов ... Так что я пытаюсь сделатьthis:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    var my800Entities = modelBuilder.Model.GetEntityTypes().ToList();

    foreach (var entity in my800Entities)
    {
       modelBuilder.Entity(entity.Name).HasOne("Company").WithMany().OnDelete(DeleteBehavior.Cascade);
       /* It seems to me that this code is creating an
       extra column and not defining the already existing property */
    }

}

Приведенный выше код генерирует миграцию с еще одним столбцом в каждом классе, например:

  • Другие свойства ...
  • Компания (с FK ограничить поведение при удалении)
  • Company1 (С FK каскад поведение при удалении)

Что мне нужно сделать, только для 1 столбца (Компания) с поведением удаления Каскад?

1 Ответ

0 голосов
/ 06 июня 2018

Сначала отфильтруйте типы сущностей, которые реализуют интерфейс:

var my800Entities = modelBuilder.Model.GetEntityTypes()
    .Where(t => typeof(ITest).IsAssignableFrom(t.ClrType))
    .ToList();

Затем (и это главная проблема с вашим кодом), передайте как связанный тип, так и имя свойства навигации в метод HasOne(в настоящее время вы передаете только имя связанного типа, которое эквивалентно универсальному параметру HasOne без параметров и указывает на отношение без свойства навигации, поэтому EF Core связывает другое отношение с этим свойством):

foreach (var entity in my800Entities)
{
    modelBuilder.Entity(entity.Name)
       .HasOne(typeof(Company), "Company") // <--
       .WithMany()
       .OnDelete(DeleteBehavior.Cascade);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...