Entity Framework The ALTER TABLE statement conflicted with the FOREIGN KEY constraint

后端 未结 11 1798
傲寒
傲寒 2021-02-01 00:34

On updating database in Entity Framework , Code first Migration, I am getting this error:

The ALTER TABLE statement conflicted with the FOREIGN KEY constr

相关标签:
11条回答
  • 2021-02-01 01:09

    Assuming your migrations are in correct order i.e. table associated with Foreign key will get created before the reference. Follow the following steps:

    1. Backup current database from SQL management studio (If required)
    2. Delete database from SQL management studio
    3. Type 'Update-Database'in Visual Studio 'Package Manager Console'
    0 讨论(0)
  • 2021-02-01 01:13

    I had this issue as well with defaultValue set, gave:

    "The object is dependent on column ALTER TABLE ALTER COLUMN failed because one or more objects access this column".

    Ended up move the AddForeignKey/DropForeignKey to a new migration and ran them in separate update-database commands (dont excecute both migrations in one command then it failed for me.)

        public override void Up()
        {
            CreateTable(
                "dbo.DecisionAccesses",
                c => new
                {
                    Id = c.Int(nullable: false),
                    Name = c.String(nullable: false, maxLength: 50),
                })
                .PrimaryKey(t => t.Id);
    
            CreateTable(
                "dbo.DecisionPersonStatus",
                c => new
                {
                    Id = c.Int(nullable: false),
                    Name = c.String(nullable: false, maxLength: 50),
                })
                .PrimaryKey(t => t.Id);
    
            AddColumn("dbo.DecisionForm_DecisionFields", "DecisionAccessId", c => c.Int(nullable: false, defaultValue: (int)DecisionAccess.Creator));
            AddColumn("dbo.DecisionMatterPersons", "DecisionPersonStatusId", c => c.Int(nullable: false, defaultValue: (int)DecisionAccess.Creator));
            CreateIndex("dbo.DecisionForm_DecisionFields", "DecisionAccessId");
            CreateIndex("dbo.DecisionMatterPersons", "DecisionPersonStatusId");
            //I moved outcommented to next migration and ran the migrations in separate steps to avoid: (The object is dependent on column ALTER TABLE ALTER COLUMN failed because one or more objects access this column)
            //AddForeignKey("dbo.DecisionForm_DecisionFields", "DecisionAccessId", "dbo.DecisionAccesses", "Id", cascadeDelete: true); 
            //AddForeignKey("dbo.DecisionMatterPersons", "DecisionPersonStatusId", "dbo.DecisionPersonStatus", "Id", cascadeDelete: true);
        }
    
    
        public override void Down()
        {
            //Moved to next migration
            //DropForeignKey("dbo.DecisionMatterPersons", "DecisionPersonStatusId", "dbo.DecisionPersonStatus");
            //DropForeignKey("dbo.DecisionForm_DecisionFields", "DecisionAccessId", "dbo.DecisionAccesses");
        }
    
    0 讨论(0)
  • 2021-02-01 01:14

    Check that there is not existing data in the database that is conflicting with the FK constraint causing the creation to fail.

    0 讨论(0)
  • 2021-02-01 01:14

    I think @Cory was getting you close to the correct solution, you just did not take the time to investigate.

    In add-migration code, the migration probably generated

    public override void Up()
    {
    AddColumn("dbo.ClientContacts", "FamilialRelationshipId", c => c.Int(nullable: false));
    CreateIndex("dbo.ClientContacts", "FamilialRelationshipId");
    AddForeignKey("dbo.ClientContacts", "FamilialRelationshipId", "dbo.FamilialRelationships",        "FamilialRelationshipId");
    }
    

    Notice nullable:false; If your Model had an Id of int instead of int? (nullable int) the migration code will set nullable to false. Your model shows you are using a non-nullable int which defaults to 0, and you probably don't have a foreign key item with a value of 0.

    Now, you will have to either create a default value, that exists in the foreign key table, or Create the Constraint with no check if you are using SQL Server to create the constraint. Remember this though: If you decorate your property with a [DefaultValue(0)] attribute, it won't change the existing data, like a SQL Column Add would, if a default value was specified.

    I recommend you change your Model Class to allow a nullable int. Then, in your seed method, create a simple method against dbcontext to update the new column with a default value, because the [DefaultValue] attribute in data annotations will not modify your data.

    Add-Migration / Update-Database to create the column and constraint. Next, modify your model if you desire to allow for a non-nullable int, and presuming you changed all rows to some valid value for the foreign key, Add-Migration / Update-database again. This gives you an unbroken chain in your model migration. Will come in handy later when you publish to a live site, because the flow of your data model changes will be intact.

    • Hope this helps.
    0 讨论(0)
  • 2021-02-01 01:24

    I got the solution of my Problem. Problem is "data" which i have in my clients table. Because my client table have medicalgroupid values which are not actually exist that's why it is giving me error on foreign key constraint.

    Update Client set MedicalGroupId = NULL
    
    0 讨论(0)
  • 2021-02-01 01:24

    Run the Add-Migration InitialCreate –IgnoreChanges command in Package Manager Console. This creates an empty migration with the current model as a snapshot.

    Run the Update-Database command in Package Manager Console. This will apply the InitialCreate migration to the database. Since the actual migration doesn’t contain any changes, it will simply add a row to the __MigrationsHistory table indicating that this migration has already been applied.

    You can get more detail here : https://msdn.microsoft.com/en-us/library/dn579398(v=vs.113).aspx

    0 讨论(0)
提交回复
热议问题