Удалить запись с ограничением внешнего ключа - PullRequest
0 голосов
/ 07 сентября 2018

Приложение ASP.NET CORE 2.1

Привет всем,

У меня есть проект, который выдает ошибку, когда я пытаюсь удалить запись. Ссылки на первичный ключ существуют в таблице ProductDescription . Я попробовал метод API api для определения внешнего ключа. Куда я иду не так?

Модель

public class Product
{

   [Key]
    public int Id { get; set; }
    public string ProductName { get; set; }
    public string Price { get; set; }

    public ProductDescription ProductDescriptions {get; set;}
}


public class ProductDescription
{
   public int DescriptionId { get; set; }
   public string Amount     { get; set; }
   public string Colour     { get; set; }

   public Product Product   { get; set; }
} 

Контроллер

public async Task<IActionResult> Delete(int? id)
{
    if (id == null) return NotFound();

    var products = await _context.Product
        .SingleOrDefaultAsync(m => m.Id == id);

    if (products == null) NotFound();

    return View(products);
}


[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
    var product = await _context.Product.SingleOrDefaultAsync(m => m.Id == id);
    _context.Product.Remove(product);
    await _context.SaveChangesAsync();
    return RedirectToAction(nameof(Index));
}

ApplicationDbContext

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<Product>()
        .HasOne(s => s.ProductDescription)
        .WithMany()
        .OnDelete(DeleteBehavior.Cascade);

    base.OnModelCreating(builder);
}
public DbSet<Product> Products { get; set; }
public DbSet<ProductDescription> ProductDescriptions  { get; set; }

Исключительная ошибка

Произошло необработанное исключение при обработке запроса. SqlException: инструкция DELETE конфликтует с ограничением REFERENCE "FK_ProductDescription_Product_ProductId". Конфликт произошел в базе данных «FoodInventoryDB», таблица «dbo.ProductDescription», столбец «ProductId». Заявление было прекращено.

1 Ответ

0 голосов
/ 07 сентября 2018

Так что я наконец исправил это. Надеюсь, что это помогает другим ...

Вот что я сделал:

[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
    var product = await _context.Product.SingleOrDefaultAsync(m => m.Id == id);
    var stuff = await _context.ProductDescription.FirstOrDefaultAsync(c => c.Product.Id == id);
    _context.Product.Remove(product);
    _context.ProductDescription.Remove(stuff);
    await _context.SaveChangesAsync();
    return RedirectToAction(nameof(Index));
}

   builder.Entity<Product>()
        .HasMany(s => s.ProductDescription)
        .WithOne(c = c.Product)
        .OnDelete(DeleteBehavior.Cascade);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...