为什么EF迁移不会产生正确的多对多关系?

时间:2016-07-05 20:20:59

标签: entity-framework ef-migrations

我有一些EF Code First表(如果它们是ApplicationUser就有一个),我试图生成迁移以添加多对多关系。

public class ApplicationUser : IdentityUser
{
    // many properties, not relevant here

    // NEW RELATIONSHIP
    public virtual ICollection<Trip> Trips { get; set; } = new HashSet<Trip>();
}

public class Trip
{
    // again, many properties

    public string ClientId { get; set; }

    [ForeignKey(nameof(ClientId))]
    public virtual ApplicationUser Client { get; set; }

    public string PartnerId { get; set; }

    [ForeignKey(nameof(PartnerId))]
    public virtual ApplicationUser Partner { get; set; }

    // NEW RELATIONSHIP
    public virtual ICollection<ApplicationUser> OtherUsers { get; set; } = new HashSet<ApplicationUser>();

}

请注意,已经存在关系(Trip有两个外键给ApplicationUser,但我添加了一个新的。

当我在控制台中运行Add-Migration Trips时,会生成:

public partial class Trips : DbMigration
{
    public override void Up()
    {
        AddColumn("dbo.AspNetUsers", "Trip_TripId", c => c.Int());
        AddColumn("dbo.Trips", "ApplicationUser_Id", c => c.String(maxLength: 128));
        CreateIndex("dbo.AspNetUsers", "Trip_TripId");
        CreateIndex("dbo.Trips", "ApplicationUser_Id");
        AddForeignKey("dbo.AspNetUsers", "Trip_TripId", "dbo.Trips", "TripId");
        AddForeignKey("dbo.Trips", "ApplicationUser_Id", "dbo.AspNetUsers", "Id");
    }

    public override void Down()
    {
        DropForeignKey("dbo.Trips", "ApplicationUser_Id", "dbo.AspNetUsers");
        DropForeignKey("dbo.AspNetUsers", "Trip_TripId", "dbo.Trips");
        DropIndex("dbo.Trips", new[] { "ApplicationUser_Id" });
        DropIndex("dbo.AspNetUsers", new[] { "Trip_TripId" });
        DropColumn("dbo.Trips", "ApplicationUser_Id");
        DropColumn("dbo.AspNetUsers", "Trip_TripId");
    }
}

为什么要创建两个一对多关系而不是多对多关系?我期待生成第三张表。

我之前没有遇到任何问题,但我不知道我已经拥有外键的事实是否干扰了这一代。

我已经看过another answer使用Fluent API解决了这个问题,但我以前从未需要使用它。它真的是解决它的唯一方法吗?我做错了什么?

1 个答案:

答案 0 :(得分:1)

我认为你需要在其中一个新系列上使用InverseProperty。尝试更改Trip课程,如下所示

// NEW RELATIONSHIP
[InverseProperty("Trips")]
public virtual ICollection<ApplicationUser> OtherUsers { get; set; } = new HashSet<ApplicationUser>();

告诉它关系是OtherUsers集合和Trips属性/集合之间的关系。

Using both many-to-many and one-to-many to same entity

的更多信息

<强>更新 我注意到另一个问题的评论是否有效是不明确的。我没有亲自尝试过多对多关系,但这适用于Entity Framework, code-first: combining master-detail with zero-to-one relationship

等情况

我很想知道它是否适用于你的情况。