Отношение EF Core One к One во многих таблицах позволяет дублировать записи - PullRequest
0 голосов
/ 16 февраля 2019

Я использую EF Core и пытался создать взаимно-однозначное соотношение между тремя таблицами (Car, ElectricCar и PetrolCar)

public class Car
{
    public int Id { get; set; }
    public string RegistrationNumber { get; set; }

    public ElectricCar Company { get; set; }
    public PetrolCar Trust { get; set; }
}

public class ElectricCar
{
    public int ElectricCarId { get; set; }
    public double BatteryCapacityWattage{ get; set; }

    public int CarId { get; set; }
    public Car Car { get; set; }
}

public class PetrolCar
{
    public int PetrolCarId { get; set; }
    public double TankCapacity { get; set; }

    public int CarId { get; set; }
    public Car Car { get; set; }
}


public partial class CarDbContext : Microsoft.EntityFrameworkCore.DbContext
{
    public CarDbContext()
    {
    }

    public CarDbContext(DbContextOptions<CarDbContext> options)
        : base(options)
    {
    }

    public DbSet<ElectricCar> ElectricCar { get; set; }
    public DbSet<Car> Car { get; set; }
    public DbSet<PetrolCar> PetrolCar { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer("Server=DESKTOP-PC\\SQLLOCAL;Database=OneToOneEFCoreCar;Trusted_Connection=True;");
        }
    }
}

и кодом, который вставляет данные:

CarDbContext context = new CarDbContext();

context.Car.Add(new Car
{
    RegistrationNumber = "EL123",
    Company = new ElectricCar() { BatteryCapacityWattage = 2000 }
});

context.Car.Add(new Car
{
    RegistrationNumber = "PETR123",
    Trust = new PetrolCar() {  TankCapacity = 50 }
});
context.SaveChanges();

Это работает без проблем и создает следующие данные enter image description here

Когда я захожу в PetrolCar, я вставляю новую строку с CarId = 1, и она принимает еебез каких-либо ошибок, хотя этот CarId используется в таблице ElectricCar как CarId.Есть ли способ ограничить это?

1 Ответ

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

Если вы полностью настроены на то, чтобы сохранить ваши объектные модели / структуру данных такими же, как указано выше, то уникальное ограничение для двух таблиц не будет реально достижимо изначально.

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

что-то вроде:

public override SaveChanges()
{
    var petrolCars = ChangeTracker.Entries().Where(e is PetrolCar).ToList();

    foreach(var pCar in petrolCars)
    { 
        if(query the database for electric cars to see if car id exists)
        {
            do some sort of error processing and avoid saving;
        }
    }

    base.SaveChanges();
}

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

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