entity-framework - EF Core 2.0 迁移 - 具有附加字段的多对多

标签 entity-framework many-to-many ef-core-2.0

我正在使用 EF Core 2.0 并创建了与联接实体的多对多关系。当我添加新的迁移 EF 时,总是会创建一个额外的索引/Id 字段,这是完全愚蠢的。这是我的加入实体:

public class Team_Member
{
    public int TeamId { get; set; }
    public Team Team { get; set; }

    public int MemberId { get; set; }
    public Member Member { get; set; }

    public MemberTypeEnum MemberType { get; set; }
}

这是连接表的配置(遵循互联网上的几个示例):

public class Team_MemberConfig : IEntityTypeConfiguration<Team_Member>
{
    public void Configure(EntityTypeBuilder<Team_Member> builder)
    {
        builder.ToTable("Team_Member");
        builder.HasKey(tm => new { tm.TeamId, tm.MemberId });
        builder.HasOne<Team>()
            .WithMany(t => t.Team_Member)
            .HasForeignKey(tm => tm.TeamId)
            .OnDelete(DeleteBehavior.Restrict);
        builder.HasOne<Member>()
            .WithMany(m => m.Team_Member)
            .HasForeignKey(tm => tm.MemberId)
            .OnDelete(DeleteBehavior.Restrict);
    }
}

对于每个外键列,迁移都会添加第二个外键列:

columns: table => new
            {
                TeamId = table.Column<int>(nullable: false),
                MemberId = table.Column<int>(nullable: false),
                **MemberId1** = table.Column<int>(nullable: true),
                MemberType = table.Column<int>(nullable: false),
                **TeamId1** = table.Column<int>(nullable: true)
            },

和两个完全相同的约束:

table.ForeignKey(
                    name: "FK_Team_Member_Member_MemberId",
                    column: x => x.MemberId,
                    principalTable: "Member",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Restrict);
                table.ForeignKey(
                    name: "FK_Team_Member_Member_MemberId1",
                    column: x => x.MemberId1,
                    principalTable: "Member",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Restrict);
                table.ForeignKey(
                    name: "FK_Team_Member_Team_TeamId",
                    column: x => x.TeamId,
                    principalTable: "Team",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Restrict);
                table.ForeignKey(
                    name: "FK_Team_Member_Team_TeamId1",
                    column: x => x.TeamId1,
                    principalTable: "Team",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Restrict);

我在这里做错了什么?

最佳答案

任何时候您看到 EF(核心)生成额外的 FK 列,都清楚地表明由于使用了错误的流畅 API 重载而导致未映射的引用或集合导航属性。所有相关的 Fluent API(HasOneHasManyWithOneWithMany)都具有带导航属性且不带导航属性的重载。当相应的实体没有导航时,您必须使用第一个,并且您应该使用精确表示相应实体中是否存在导航属性。如果不这样做,就会留下未映射的导航属性,并且 EF 会创建其他关系。

就您的情况而言,两个差异(标记为 A、B)介于:

public class Team_Member
{
    public int TeamId { get; set; }
    public Team Team { get; set; } // <-- A

    public int MemberId { get; set; }
    public Member Member { get; set; } // <-- B

    public MemberTypeEnum MemberType { get; set; }
}

builder.HasOne<Team>() // <-- A
    .WithMany(t => t.Team_Member)
    .HasForeignKey(tm => tm.TeamId)
    .OnDelete(DeleteBehavior.Restrict);
builder.HasOne<Member>() // <-- B
    .WithMany(m => m.Team_Member)
    .HasForeignKey(tm => tm.MemberId)
    .OnDelete(DeleteBehavior.Restrict);

如前所述,只需使它们匹配即可:

builder.HasOne(tm => tm.Team) // <-- A
    .WithMany(t => t.Team_Member)
    .HasForeignKey(tm => tm.TeamId)
    .OnDelete(DeleteBehavior.Restrict);
builder.HasOne(tm => tm.Member) // <-- B
    .WithMany(m => m.Team_Member)
    .HasForeignKey(tm => tm.MemberId)
    .OnDelete(DeleteBehavior.Restrict);

问题就解决了。

关于entity-framework - EF Core 2.0 迁移 - 具有附加字段的多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48469730/

相关文章:

c# - 更新到 EF 7.0.0-rc1-final 破坏了 SQL DbContextOptionsBuilder UseSqlServer

nhibernate - 删除多对多关系会导致删除和插入查询

many-to-many - spring Roo中如何做多对多关系,属性在de关系中?

c# - Entity Framework Core 2 一对一关系 "on one table"

c# - 工作单元模式中的 EF Core 封装

entity-framework - 身份规范设置为false

sql-server - 外键 Entity Framework 6 在依赖表中插入 null

c# - DbQuery 与 IQueryable SQL 性能对比

python - 如何避免在 SQLAlchemy - python 的多对多关系表中添加重复项?

entity-framework - 从对基类的请求中排除派生实体