Оператор INSERT конфликтовал с ограничением FOREIGN KEY "FK_Cars_Owners_OwnerId" - PullRequest
0 голосов
/ 18 июня 2019

Я создаю новый WebAPI на ASP.Net Core 2.2, и мне нужно определить отношения между двумя моделями в SQL Server:

Car

public class Car
{
    [Key]
    public Guid CarId { get; set; }
    public string Brand { get; set; }
    public Guid OwnerId { get; set; }
    public Owner Owner { get; set; }
}

Owner

public class Owner
{
    [Key]
    public Guid OwnerId { get; set; }
    public string Name { get; set; }
    public string Phone { get; set; }
    public IEnumerable<Car> Cars { get; set; }
}

Это метод Post в CarsController

private const string AlexGuid = "21fd1de8-ce31-4224-b0b1-39e3f9dbaa18";
...
[HttpPost(ApiRoutes.Cars.Create)]
        public async Task<IActionResult> Add([FromBody] CreateCarRequest carRequest)
        {
            var car = new Car { Brand = carRequest.Brand };

            if (car.CarId == Guid.Empty)
            {
                car.CarId = Guid.NewGuid();
            }

            if (car.Owner.OwnerId == Guid.Empty)
            {
                car.OwnerId = Guid.Parse(AlexGuid);
            }

            await _carService.AddCarAsync(car);

            var baseUrl = $"{HttpContext.Request.Scheme}://{HttpContext.Request.Host.ToUriComponent()}";
            var locationUri = baseUrl + "/" + ApiRoutes.Cars.Get.Replace("{carId}", car.CarId.ToString());

            var response = new CarResponse { CarId = car.CarId };
            return Created(locationUri, response);
        }

Ошибка возникает в этой строке кода:

await _carService.AddCarAsync(car);

Debug car controller

DataContext класс:

public class DataContext : IdentityDbContext
    {
        public DataContext(DbContextOptions<DataContext> options) : base(options)
        {
        }

        public DbSet<Car> Cars { get; set; }
        public DbSet<Owner> Owners { get; set; }

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

            modelBuilder.Entity<Owner>()
                .HasMany(c => c.Cars)
                .WithOne(e => e.Owner);
        }
    }

CarService метод класса:

public async Task<bool> AddCarAsync(Car car)
        {
            await _dataContext.Cars.AddAsync(car);
            var added = await _dataContext.SaveChangesAsync();
            return added > 0;
        }

Произошло необработанное исключение при выполнении запроса. Microsoft.EntityFrameworkCore.DbUpdateException: при обновлении записей произошла ошибка. Смотрите внутреннее исключение для деталей. ---> System.Data.SqlClient.SqlException: оператор INSERT вступил в конфликт с ограничением FOREIGN KEY "FK_Cars_Owners_OwnerId". Конфликт произошел в базе данных «CarOwnersDB», таблице «dbo.Owners», столбце «OwnerId».

1 Ответ

1 голос
/ 18 июня 2019

Похоже, вы пытаетесь добавить Car, который ссылается на Owner, которого нет в таблице Owner. Это основное нарушение внешнего ключа.

Сначала вставьте Owner таблицы Car в Owner (или проверьте на наличие - если она уже существует, тогда ничего не нужно делать), затем вставьте Car.

Так что вам нужно сделать что-то вроде:

await _dataContext.Owners.AddAsync(car.Owner);

перед вставкой машины.

...