Введение ограничения FOREIGN KEY для таблицы может привести к появлению циклов или нескольких каскадных путей для класса, который ссылается на себя - PullRequest
0 голосов
/ 10 октября 2019

Я получаю ошибку Introducing FOREIGN KEY constraint 'FK_Company_Company_ParentId' on table 'Company' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. при попытке обновить базу данных, которая содержит класс, который ссылается на себя.

Класс, который порождает проблему:

    public class Company
    {
        public Country Country { get; set; }
        [Required]
        public int CountryId { get; set; }
        [Required]
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
        public Company Parent { get; set; }
        public int ParentId { get; set; }
    }

Мой dbcontext выглядит следующим образом:

using System;
using System.Collections.Generic;
using System.Text;
using ArtGalleries.Domain;
using Microsoft.EntityFrameworkCore;

namespace ArtGalleries.Data
{
    public class ArtGalleriesContext:DbContext
    {
        public ArtGalleriesContext(DbContextOptions<ArtGalleriesContext> options):base(options)
        {

        }

        public DbSet<ArtItem> ArtItems { get; set; }
        public DbSet<Artist> Artists { get; set; }
        public Company Companies { get; set; }
        public DbSet<Floor> Floors { get; set; }
        public Location Locations { get; set; }
        public DbSet<Room> Rooms { get; set; }
        public DbSet<User> Users { get; set; }






        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<UserLocation>()
                .HasKey(u => new {u.UserId, u.LocationId});
            //modelBuilder.Entity().
            //modelBuilder.Entity<Company>()
            //    .HasOne(c => c.Company)
            //    .WithOne(pc => pc.Company)
            //    .HasForeignKey(fk => fk.ParentId);
        }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlServer(
                    "Server=(localdb)\\mssqllocaldb;Database=GalleriesDB;Trusted_Connection=True;");
            }
        }
    }
}

Примечание: закомментированный текст - моя попытка исправить эту проблему, но безрезультатная, так как я получаю синтаксические ошибки.

1 Ответ

1 голос
/ 11 октября 2019

Для самостоятельной ссылки в EF Core вы должны установить для ParentId значение Nullable и использовать ForeignKey , чтобы указать, какое свойство следует использовать в качестве свойства внешнего ключа для данного отношения, как показано ниже:

public class Company
{
    [Required]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }


    public int? ParentId { get; set; }
    [ForeignKey("ParentId")]
    public Company Parent { get; set; }

    [Required]
    public int CountryId { get; set; }
    [ForeignKey("CountryId ")]
    public Country Country { get; set; }

}
...