EF Core - Как разрешить каскадное удаление для сложного объекта, который имеет два списка других сложных объектов? - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь заставить его работать

Я хотел бы иметь Dealer, у которого есть два списка того же типа Items, которые связаны, но я бы также хотел иметь возможность каскадного удаления их

public class Dealer
{
    [Key]
    public Guid Id { get; set; }

    public string Name { get; set; }

    public List<Car> OldCars { get; set; } = new List<Car>();

    public List<Car> NewCars { get; set; } = new List<Car>();
}

public class Car
{
    [Key]
    public Guid Id { get; set; }

    public string Model { get; set; }

    public Dealer Dealer { get; set; }
}

Что я пытался:

Попытка # 1

modelBuilder.Entity<Car>()
.HasOne(s => s.Dealer)
.WithMany(s => s.OldCars)
.HasForeignKey(x => x.Dealer)
.OnDelete(DeleteBehavior.Cascade);

modelBuilder.Entity<Car>()
.HasOne(s => s.Dealer)
.WithMany(s => s.NewCars)
.HasForeignKey(x => x.Dealer)
.OnDelete(DeleteBehavior.Cascade);

System.InvalidOperationException: «Дилер» нельзя использовать в качестве свойства для типа сущности «Автомобиль», поскольку он настроен как навигация. '

Попытка № 2 Между тем с:

modelBuilder.Entity<Car>()
.HasOne(s => s.Dealer)
.WithMany(s => s.NewCars)
.HasPrincipalKey(x => x.Id) <--- Principal!
.OnDelete(DeleteBehavior.Cascade);     

Работает нормально, но показывает предупреждение, что

предупреждение: Microsoft.EntityFrameworkCore.Model [10605] Между 'Car' и 'Dealer' существует несколько взаимосвязей без настроенных свойств внешнего ключа, в результате чего EF создает теневые свойства для 'Car', имена которых зависят от порядка обнаружения.

Data in db

К сожалению, при попытке выполнить удаление (каскад) выдается исключение:

SqlException: инструкция DELETE конфликтует с ограничением REFERENCE "FK_Cars_Dealers_DealerId1". Конфликт произошел в базе данных «testDB», таблице «dbo.Cars», столбце «DealerId1». Заявление было прекращено.

Попытка № 3

Когда я добавляю идентификатор дилера в машину

public class Car
{
    [Key]
    public Guid Id { get; set; }

    public string Model { get; set; }

    public Dealer Dealer { get; set; }

    public Guid DealerID { get; set; }
}

Он кричит о

System.Data.SqlClient.SqlException: 'Невозможно создать, удалить, включить или отключить более одного ограничения, столбца, индекса или триггера с именем' FK_Cars_Dealers_DealerId 'в этом контексте. Дубликаты имен не допускаются. Имена столбцов в каждой таблице должны быть уникальными. Имя столбца 'DealerId' в таблице 'Автомобили' указывается более одного раза. '

# Попытка # 3.1

Итак, после переименования Guid DealerID например, Guid DealerID123

кричит

SqlException: оператор INSERT конфликтует с ограничением FOREIGN KEY "FK_Cars_Dealers_DealerID123". Конфликт произошел в базе данных «testDB», таблице «dbo.Dealers», столбце «Id». Заявление было прекращено.

У кого-нибудь есть идеи, как заставить это работать?

1 Ответ

0 голосов
/ 29 мая 2019

Благодаря рекомендации Ивана Стоева мне удалось решить ее следующим образом:

public class Dealer
{
   [Key]
   public Guid Id { get; set; }
   public string Name { get; set; }
   [NotMapped]
   public List<Car> OldCars { get; set; } => NewCars.Where(c => c.IsOld == true);
   public List<Car> NewCars { get; set; } = new List<Car>();
}

public class Car
{
   [Key]
   public Guid Id { get; set; }
   public string Model { get; set; }
   public Dealer Dealer { get; set; }
   public bool IsOld { get; set; }
}

в EF6 ModelBuilder я сделал так:

modelBuilder.Entity<Dealer>()
.HasMany(d => d.NewCars)
.WithRequired()
.WillCascadeOnDelete(true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...