Upgrade from EF 5 to 6, New Migration Swap Columns

When upgrading the first code project from Entity Framework 5 to 6.1.1, a model with two foreign keys in the same table causes the Entity Framework to detect a schema change when no changes should occur.

Here is the model in question.

public class UserActivity : Activity
{
    public string UserMessage { get; set; }

    public int? OriginatorId { get; set; }
    public int UserId { get; set; }

    public virtual User Originator { get; set; }
    public virtual User User { get; set; }

    public class Configuration : EntityTypeConfiguration<UserActivity>
    {
        public Configuration()
        {
            HasOptional(x => x.Originator).WithMany().HasForeignKey(x => x.OriginatorId).WillCascadeOnDelete(false);
            HasRequired(x => x.User).WithMany().HasForeignKey(x => x.UserId).WillCascadeOnDelete(false);
        }
    }
}

Here is the Migration generated when the Add-Migration command was run from the Package Manager Console.

public partial class EF6 : DbMigration
{
    public override void Up()
    {
        DropForeignKey("dbo.UserActivities", "UserId", "dbo.Users");
        RenameColumn(table: "dbo.UserActivities", name: "UserId", newName: "__mig_tmp__0");
        RenameColumn(table: "dbo.UserActivities", name: "OriginatorId", newName: "UserId");
        RenameColumn(table: "dbo.UserActivities", name: "__mig_tmp__0", newName: "OriginatorId");
        AlterColumn("dbo.UserActivities", "OriginatorId", c => c.Int());
        AlterColumn("dbo.UserActivities", "UserId", c => c.Int(nullable: false));
        AddForeignKey("dbo.UserActivities", "OriginatorId", "dbo.Users", "ID");
        AddForeignKey("dbo.UserActivities", "UserId", "dbo.Users", "ID");
    }

    public override void Down()
    {
        DropForeignKey("dbo.UserActivities", "UserId", "dbo.Users");
        DropForeignKey("dbo.UserActivities", "OriginatorId", "dbo.Users");
        AlterColumn("dbo.UserActivities", "UserId", c => c.Int());
        AlterColumn("dbo.UserActivities", "OriginatorId", c => c.Int(nullable: false));
        RenameColumn(table: "dbo.UserActivities", name: "OriginatorId", newName: "__mig_tmp__0");
        RenameColumn(table: "dbo.UserActivities", name: "UserId", newName: "OriginatorId");
        RenameColumn(table: "dbo.UserActivities", name: "__mig_tmp__0", newName: "UserId");
        AddForeignKey("dbo.UserActivities", "UserId", "dbo.Users", "ID", cascadeDelete: true);
    }
}

Is there an error in EF 6.1.1 that explains this behavior? It seems that EF 6 does not detect 2 foreign keys correctly.

How work, doing two separate migrations, the first removal of foreign keys and the second migration to add foreign keys, seems to solve the problem.

+4

All Articles