Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths - why?

前端 未结 18 952
天涯浪人
天涯浪人 2020-11-22 02:37

I\'ve been wrestling with this for a while and can\'t quite figure out what\'s happening. I have a Card entity which contains Sides (usually 2) - and both Cards and Sides h

相关标签:
18条回答
  • 2020-11-22 03:17

    In .NET Core I played with all upper answers - but without any success. I made changes a lot in DB structure and every time added new migration attempting to update-database, but received the same error.

    Then I started to remove-migration one by one until Package Manager Console threw me exception:

    The migration '20170827183131_***' has already been applied to the database

    After that, I added new migration (add-migration) and update-database successfully

    So my suggestion would be: clear out all your temp migrations, until your current DB state.

    0 讨论(0)
  • 2020-11-22 03:20

    The simple way is to, Edit your migration file (cascadeDelete: true) into (cascadeDelete: false) then after assign the Update-Database command in your Package Manager Console.if it's problem with your last migration then all right. Otherwise check your earlier migration history, copy those things, paste into your last migration file, after that do it the same thing. it perfectly works for me.

    0 讨论(0)
  • 2020-11-22 03:21
    public partial class recommended_books : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "dbo.RecommendedBook",
                c => new
                    {
                        RecommendedBookID = c.Int(nullable: false, identity: true),
                        CourseID = c.Int(nullable: false),
                        DepartmentID = c.Int(nullable: false),
                        Title = c.String(),
                        Author = c.String(),
                        PublicationDate = c.DateTime(nullable: false),
                    })
                .PrimaryKey(t => t.RecommendedBookID)
                .ForeignKey("dbo.Course", t => t.CourseID, cascadeDelete: false) // was true on migration
                .ForeignKey("dbo.Department", t => t.DepartmentID, cascadeDelete: false) // was true on migration
                .Index(t => t.CourseID)
                .Index(t => t.DepartmentID);
    
        }
    
        public override void Down()
        {
            DropForeignKey("dbo.RecommendedBook", "DepartmentID", "dbo.Department");
            DropForeignKey("dbo.RecommendedBook", "CourseID", "dbo.Course");
            DropIndex("dbo.RecommendedBook", new[] { "DepartmentID" });
            DropIndex("dbo.RecommendedBook", new[] { "CourseID" });
            DropTable("dbo.RecommendedBook");
        }
    }
    

    When your migration fails you are given a couple of options: 'Introducing FOREIGN KEY constraint 'FK_dbo.RecommendedBook_dbo.Department_DepartmentID' on table 'RecommendedBook' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint or index. See previous errors.'

    Here is an example of using the 'modify other FOREIGN KEY constraints' by setting 'cascadeDelete' to false in the migration file and then run 'update-database'.

    0 讨论(0)
  • 2020-11-22 03:24

    Make your Foreign key attributes nullable. That will work.

    0 讨论(0)
  • 2020-11-22 03:26

    Anybody wondering how to do it in EF core:

          protected override void OnModelCreating(ModelBuilder modelBuilder)
                {
                    foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
                    {
                        relationship.DeleteBehavior = DeleteBehavior.Restrict;
                    }
               ..... rest of the code.....
    
    0 讨论(0)
  • 2020-11-22 03:26

    In .NET Core I changed the onDelete option to ReferencialAction.NoAction

             constraints: table =>
                {
                    table.PrimaryKey("PK_Schedule", x => x.Id);
                    table.ForeignKey(
                        name: "FK_Schedule_Teams_HomeId",
                        column: x => x.HomeId,
                        principalTable: "Teams",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.NoAction);
                    table.ForeignKey(
                        name: "FK_Schedule_Teams_VisitorId",
                        column: x => x.VisitorId,
                        principalTable: "Teams",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.NoAction);
                });
    
    0 讨论(0)
提交回复
热议问题