无论何时,只要看到EF(Core)生成额外的FK列,就可以清楚地看到由于使用错误的fluent API重载而导致的未映射引用或集合导航属性。所有相关fluent API(
HasOne
,
HasMany
,
WithOne
,
WithMany
)具有带导航属性且不带导航属性的重载。当对应实体没有导航时,必须使用第一个,并且应该使用
准确的
一个表示相应实体中是否存在导航属性的属性。否则将留下未映射的导航属性,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);
问题已经解决了。