Ошибка «Введение ограничения FOREIGN KEY» - PullRequest
1 голос
/ 18 мая 2019

У меня есть 3 основных объекта: Категория, Подкатегория, Продукты:

public class Product
{
    public Product()
    {
        Photos = new List<Photo>();
        Comments = new List<Comment>();
        Colors = new List<ProductColor>();
        Attributes = new List<ProductAttributes>();
    }

    public int Id { get; set; }
    public string ProductName { get; set; }
    public string BrandName { get; set; }
    public string SellerName { get; set; }
    public decimal Price { get; set; }
    public bool OnSale { get; set; }
    public int SalePercantage { get; set; }
    public DateTime DateAdded { get; set; }
    public int UnitsInStock { get; set; }

    public string MainImageUrl 
    { 
        get 
        {
            return Photos.Count > 0 ? Photos[0].PhotoPath : "https://dummyimage.com/600x600/e0d0e0/ffffff.png";
        }
    }

    public decimal ShownPrice 
    {
        get 
        {
            if (OnSale) 
            {
                return SalePrice; 
            }
            else 
            {  
                return Price; 
            }
        } 
    }

    public decimal SalePrice 
    {
        get 
        {
            return (decimal)((decimal)Price - ((decimal)Price * ((decimal)SalePercantage / (decimal)100)));
        }
    }

    public bool IsNewBrand 
    {
        get 
        {
            return DateTime.Now.AddDays(-3) <= DateAdded;
        } 
    }

    public int SubCategoryId { get; set; }
    public SubCategory SubCategory { get; set; }
    public List<Photo> Photos { get; set; }
    public List<Comment> Comments { get; set; }
    public List<ProductColor> Colors { get; set; }
    public List<ProductAttributes> Attributes { get; set; }

    public List<ProductCategory> ProductCategories { get; set; }
    public List<ProductProductSize> ProductSizes { get; set; }
}

public class Category
{
    public int Id { get; set; }
    public string CategoryName { get; set; }

    public List<ProductCategory> ProductCategories { get; set; }
    public List<SubCategory> SubCategories { get; set; }
}

public class SubCategory
{
    public int Id { get; set; }
    public string Name { get; set; }

    public List<Product> Products { get; set; }
    public int CategoryId { get; set; }
    public Category Category { get; set; }
}

В моем DbContext я определяю свои отношения:

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

        modelBuilder.Entity<ProductCategory>().HasKey(p => new { p.CategoryId, p.ProductId });
        modelBuilder.Entity<ProductCategory>().HasOne(p => p.Product).WithMany(d => d.ProductCategories).HasForeignKey(p => p.ProductId);
        modelBuilder.Entity<ProductCategory>().HasOne(p => p.Category).WithMany(d => d.ProductCategories).HasForeignKey(p => p.CategoryId);
        modelBuilder.Entity<SubCategory>().HasOne(p => p.Category).WithMany(d => d.SubCategories).HasForeignKey(p => p.CategoryId);
        modelBuilder.Entity<Product>().HasOne(d => d.SubCategory).WithMany(p => p.Products).HasForeignKey(d => d.SubCategoryId);
}

Когда я пытаюсьПри переносе моей базы данных из PowerShell я получаю эту ошибку:

Введение ограничения FOREIGN KEY 'FK_ProductCategory_Products_ProductId' для таблицы 'ProductCategory' может привести к циклам или нескольким каскадным путям.Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY.
Не удалось создать ограничение или индекс.См. Предыдущие ошибки.

Я не смог распознать проблему здесь, что я делаю не так?

Разве я не должен иметь код HasOne.WithMany с моей сущностью ProductCategoryили что-то типа того?

Я перепробовал почти все и пока не смог найти решение.

1 Ответ

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

Укажите .OnDelete(DeleteBehavior.Restrict) в вашей ProductCategory Fluent API конфигурации следующим образом:

modelBuilder.Entity<ProductCategory>()
            .HasOne(p => p.Product)
            .WithMany(d => d.ProductCategories)
            .HasForeignKey(p => p.ProductId)
            .OnDelete(DeleteBehavior.Restrict); // <-- Here it is


modelBuilder.Entity<ProductCategory>()
            .HasOne(p => p.Category)
            .WithMany(d => d.ProductCategories)
            .HasForeignKey(p => p.CategoryId)
            .OnDelete(DeleteBehavior.Restrict); // <-- Here it is

Теперь снова сгенерируйте миграцию и обновите базу данных.

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