为什么 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
等情况
我很想知道它是否适用于您的情况。
我有一些 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
等情况我很想知道它是否适用于您的情况。