为什么 EF 迁移没有生成正确的多对多关系?

Why isn't EF Migrations generating the correct many-to-many relationship?

我有一些 EF Code First table(如果它们是 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");
    }
}

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

我以前做过这个没有问题,但我不知道我已经有外键的事实是否干扰了生成。

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

我认为您需要在其中一个新 collection 上安装 InverseProperty。尝试如下更改 Trip class

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

这表明关系是 OtherUsers collection 和 Trips property/collection 之间的关系。

更多信息请访问 Using both many-to-many and one-to-many to same entity

更新: 我注意到另一个问题的评论对于它是否有效是模棱两可的。我没有亲自尝试过 many-to-many 关系,但这适用于 Entity Framework, code-first: combining master-detail with zero-to-one relationship

等情况

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