contactmatt
contactmatt

Reputation: 18610

EF re-adding FK columns after adding ICollection navigation property

I have the following classes, that already have their tables created and defined using EF migrations:

[Table("Account")]
public class AccountEntity
{
    [Key]
    public virtual int Id { get; set; }
}

[Table("Request")]
public class RequestEntity
{
    [Key]
    public virtual int Id { get; set; }

    public int? AccountID { get; set; }

    [ForeignKey("AccountID")]
    public virtual AccountEntity Account { get; set; }
}

In the Request table, this properly created the FK FK_dbo.Request_dbo.Account_AccountID

Using SSMS, I can confirm the FK is setup properly.

In order to be able to access the Request's one-to-many property from the Account entity, I added the following property to the AccountEntity class:

public virtual ICollection<RequestEntity> Requests { get; set; }

However, now EF suspects that I need to run migrations due to domain changes.

Here's the migration class that it creates, and wants to run:

public partial class RequestUpdate : DbMigration
{
    public override void Up()
    {
        AddColumn("dbo.Request", "AccountEntity_Id", c => c.Int());
        CreateIndex("dbo.Request", "AccountEntity_Id");
        AddForeignKey("dbo.Request", "AccountEntity_Id", "dbo.Account", "Id");
    }

    public override void Down()
    {
        DropForeignKey("dbo.Request", "AccountEntity_Id", "dbo.RealtorAccount");
        DropIndex("dbo.Request", new[] { "AccountEntity_Id" });
        DropColumn("dbo.Request", "AccountEntity_Id");
    }
}

As you can see, EF seems to not recongize/respect that the FK relationshp has already been setup.

I don't suspect that any migrations need to be setup. The FK is already established, and I'm simply adding the collection "navigation" property.

Migrations need to be enabled for this project. EF version is 6, .NET 4.5.

Upvotes: 0

Views: 49

Answers (1)

Ivan Stoev
Ivan Stoev

Reputation: 205729

One possible way this can happen is if you have used fluent configuration like this:

modelBuilder.Entity<RequestEntity>()
    .HasOptional(e => e.Account)
    .WithMany();

and forgot to update the .WithMany() to .WithMany(e => e.Requests) after introducing the collection navigation property, in which case EF considers two one-to-many relationships, hence adds a second FK column with default name.

Upvotes: 1

Related Questions