Предотвращение удаления, если существует связь — Fluent API

#entity-framework #.net-core #ef-fluent-api

#entity-framework #.net-ядро #ef-fluent-api

Вопрос:

Существует One to Many взаимосвязь между Catergory и Product. В одном каталоге будет много продуктов. Однако, когда я пытаюсь удалить каталог, и если есть продукт с этим каталогом, мне не должно быть разрешено это делать.

В коде, который я написал, он разрешает удаление. Когда я удаляю каталог, он также удаляет связанный продукт. Что я хочу, чтобы мой код делал, так это запретить мне удалять каталог, если есть соответствующие записи.

Может кто-нибудь помочь мне разобраться в этом.

Catergory

 public class Catergory
{
    public int CatergoryId { get; set; }
    public string CatergoryName { get; set; }
    public string CatergoryDescription { get; set; }

    public ICollection<Product> Products { get; set; }

}
  

Продукт

 public class Product
{
    public int ProductID { get; set; }
    public string ProductName { get; set; }
    public string ProductDescription { get; set; }
    public int CatergoryID { get; set; }

    public Catergory Catergory { get; set; }
}
  

Использование Fluent API для сопоставления отношений

Конфигурация CatergoryConfiguration

 class CatergoryConfiguration : IEntityTypeConfiguration<Catergory>
{
    public void Configure(EntityTypeBuilder<Catergory> builder)
    {
        builder.ToTable("Catergory");

        builder.HasKey(c => c.CatergoryId);

        builder.Property(c => c.CatergoryName)
            .IsRequired(true)
            .HasMaxLength(400);

        builder.Property(c => c.CatergoryDescription)
            .IsRequired(true);

    }
}
  

ProductConfig

     public void Configure(EntityTypeBuilder<Product> builder)
    {
        builder.ToTable("Product");

        builder.HasKey(p => p.ProductID);

        builder.Property(p => p.ProductName)
            .HasMaxLength(400)
            .IsRequired(true);

        builder.Property(p => p.ProductDescription)
            .HasMaxLength(2000)
            .IsRequired(true);

        builder.HasOne(f => f.Catergory)
            .WithMany(r => r.Products)
            .HasForeignKey(f => f.CatergoryID);
            .OnDelete(DeleteBehavior.Restrict);
    }
}
  

Ответ №1:

К сожалению, вы не можете настроить это во FluentAPI. OnDelete задайте поведение обработки связанных объектов только при удалении основного объекта.

В вашем методе удаления вам необходимо включить логику, чтобы проверить, имеет ли a Category Products перед удалением.