【问题标题】:EF Core - may cause cycles or multiple cascade pathsEF Core - 可能导致循环或多个级联路径
【发布时间】:2019-09-22 01:12:03
【问题描述】:

我已经建立了一个我认为非常简单的数据库。但是我收到了以下错误。

在表“用户”上引入 FOREIGN KEY 约束“FK_User_Suburb_SuburbId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。 无法创建约束或索引。查看以前的错误。

这是我的 CATALOGCONtext:

using JobsLedger.CATALOG.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Internal;

namespace JobsLedger.CATALOG
{
    public class CATALOGContext : DbContext
    {
        public DbSet<Tenant> Tenants { get; set; }
        public DbSet<User> Users { get; set; }
        public DbSet<Role> Roles { get; set; }
        public DbSet<State> States { get; set; }
        public DbSet<Suburb> Suburbs { get; set; }
        public DbSet<CATALOGCounter> Counters { get; set; }


        public CATALOGContext(DbContextOptions options) : base(options) { }



        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            foreach (var entity in modelBuilder.Model.GetEntityTypes())
            {
                entity.Relational().TableName = entity.DisplayName();
            }

            // User
            modelBuilder.Entity<User>().Property(u => u.UserName).IsRequired().HasMaxLength(50);
            modelBuilder.Entity<User>().Property(u => u.UserFirstName).IsRequired().HasMaxLength(100);
            modelBuilder.Entity<User>().Property(u => u.UserLastName).IsRequired().HasMaxLength(100);
            modelBuilder.Entity<User>().Property(u => u.Email).IsRequired().HasMaxLength(200);
            modelBuilder.Entity<User>().Property(u => u.HashedPassword).IsRequired().HasMaxLength(200);
            modelBuilder.Entity<User>().Property(u => u.Salt).IsRequired().HasMaxLength(200);

            modelBuilder.Entity<User>()
                .HasOne<Suburb>(s => s.Suburb)
                .WithMany(u => u.Users)
                .HasForeignKey(u => u.SuburbId)
                .IsRequired(false);

            // Role
            modelBuilder.Entity<Role>().Property(r => r.Name).IsRequired().HasMaxLength(50);

            modelBuilder.Entity<Role>()
                .HasOne<User>(u => u.User)
                .WithOne(r => r.Role)
                .HasForeignKey<User>(u => u.RoleId);

            // TenantAccount
            modelBuilder.Entity<Tenant>().Property(t => t.TenantNo).HasMaxLength(20);
            modelBuilder.Entity<Tenant>().Property(t => t.Company).HasMaxLength(100).IsRequired();
            modelBuilder.Entity<Tenant>().Property(t => t.ContactLastName).HasDefaultValue(false).IsRequired();
            modelBuilder.Entity<Tenant>().Property(t => t.Email).HasMaxLength(500).IsRequired();
            modelBuilder.Entity<Tenant>().Property(t => t.MobilePhone).HasMaxLength(20).IsRequired();
            modelBuilder.Entity<Tenant>().Property(t => t.OfficePhone).HasMaxLength(20);
            modelBuilder.Entity<Tenant>().Property(t => t.CompanyEmail).HasMaxLength(500);
            modelBuilder.Entity<Tenant>().Property(t => t.Address1).HasMaxLength(500);
            modelBuilder.Entity<Tenant>().Property(t => t.Address2).HasMaxLength(500);
            modelBuilder.Entity<Tenant>().Property(t => t.ABN).HasMaxLength(14);
            modelBuilder.Entity<Tenant>().Property(t => t.Database).HasMaxLength(100).IsRequired();
            modelBuilder.Entity<Tenant>().Property(t => t.IsLocked).HasDefaultValue(false);

            modelBuilder.Entity<Tenant>()
                .HasOne<User>(s => s.User)
                .WithMany(ta => ta.Tenants)
                .HasForeignKey(u => u.UserId);

            modelBuilder.Entity<Tenant>()
                .HasOne(s => s.Suburb)
                .WithMany(ta => ta.Tenants)
                .HasForeignKey(ta => ta.SuburbId);

            // State
            modelBuilder.Entity<State>().Property(s => s.StateShortName).HasMaxLength(3).IsRequired();
            modelBuilder.Entity<State>().Property(s => s.StateName).HasMaxLength(30).IsRequired();

            // Suburb
            modelBuilder.Entity<Suburb>().Property(s => s.SuburbName).HasMaxLength(3).IsRequired();
            modelBuilder.Entity<Suburb>().Property(s => s.PostCode).HasMaxLength(30).IsRequired();

            modelBuilder.Entity<Suburb>()
                .HasOne<State>(s => s.State)
                .WithMany(su => su.Suburbs)
                .HasForeignKey(st => st.StateId);
        }
    }
}

这是我的用户:

...
        public int? SuburbId { get; set; }
        public Suburb Suburb { get; set; }

        public int RoleId { get; set; }
        public Role Role { get; set; }

        public virtual ICollection<Tenant> Tenants { get; set; }

这是我的郊区,也有人提到过..

想知道是否有人会强调迁移工作的原因,但是当我尝试启动数据库时,它会出现上述错误。

西蒙

【问题讨论】:

    标签: c# entity-framework asp.net-core


    【解决方案1】:

    错误已经说明了您需要做什么。指定有操作时必须执行的操作。您应该将.OnDelete() 方法添加到每个外键定义中。

    modelBuilder.Entity<Tenant>()
                    .HasOne<User>(s => s.User)
                    .WithMany(ta => ta.Tenants)
                    .HasForeignKey(u => u.UserId)
                    .OnDelete(DeleteBehavior.Restrict);
    

    更多信息请阅读https://www.learnentityframeworkcore.com/configuration/fluent-api/ondelete-method

    【讨论】:

    • 我将此答案固定在我的答案列表中
    【解决方案2】:

    你的User实体ForeignFeyFluent API配置应该如下:

    modelBuilder.Entity<User>()
         .HasOne<Suburb>(s => s.Suburb)
         .WithMany(u => u.Users)
         .HasForeignKey(u => u.SuburbId)
         .IsRequired(false);
         .OnDelete(DeleteBehavior.Restrict); // <-- Here it is
    

    【讨论】:

      【解决方案3】:

      对于发现这个问题的其他人来说,这就足够了:

      modelBuilder.Entity<User>()
           .HasOne(u => u.Suburb)
           .WithMany(s => s.Users)
           .OnDelete(DeleteBehavior.Restrict);
      

      如果您不希望 SuburbUsers 中的列表属性,您也可以这样做:

      modelBuilder.Entity<User>()
           .HasOne(u => u.Suburb)
           .WithMany()
           .OnDelete(DeleteBehavior.Restrict);
      

      【讨论】:

        猜你喜欢
        • 2020-02-04
        • 2021-08-12
        • 2020-06-14
        • 2016-03-26
        • 1970-01-01
        • 2022-01-05
        • 2018-12-19
        • 2014-02-18
        • 2018-08-04
        相关资源
        最近更新 更多