我有一些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解决了这个问题,但我以前从未需要使用它。它真的是解决它的唯一方法吗?我做错了什么?
答案 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
等情况我很想知道它是否适用于你的情况。