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

2024-04-24

我正在使用 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 (HasOne, HasMany, WithOne, WithMany)具有带导航属性和不带导航属性的重载。当相应的实体没有导航时,您必须使用第一个,并且您应该使用exact一个表示相应实体中存在/不存在导航属性。如果不这样做,则会留下未映射的导航属性,并且 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; }
}

and

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);

问题就消失了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EF Core 2.0 迁移 - 具有附加字段的多对多 的相关文章

随机推荐

  • 通过 PHP cURL 获取文件内容 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一个网站 我们就这样称呼它吧ht
  • flash、connect-flash 和express-flash 之间的区别

    我仍然对 flash connect flash 和 express flash 之间的区别感到有点困惑 安装 flashnpm install flash 快速闪存 npm install express flash 连接闪存 npm i
  • Symfony YAML 格式转换

    我有一些服务定义 如下所示 MyService class Some Class Here factory SomeFactoryHere method calls add service AnotherService1 create se
  • 从 CSV 文件读取数据并将其显示在 JTable 中

    我正在尝试从 CSV 文件读取数据并将其显示在 JTable 上 但遇到一些问题 我是菜鸟所以请耐心等待 我查看并合并了多个来源的示例代码 但无济于事 该表显示但它是空白的 我知道我正在读取数据 因为我可以打印它 我怀疑我的 ModelTa
  • 使用 require 与 fs.readFile 读取 json 文件内容

    假设对于来自 API 的每个响应 我需要将响应中的值映射到 Web 应用程序中的现有 json 文件 并显示 json 中的值 在这种情况下 读取 json 文件的更好方法是什么 require 或 fs readfile 请注意 可能有数
  • 当两个脚本实例同时写入日志时,为什么 Monolog 写入的日志行不会混乱/混合?

    当使用 Monolog 时StreamHandler 这是正常情况 PHP 脚本的多个实例会并行写入同一个日志文件 例如 在我的 Symfony 应用程序中 当多个用户同时打开 登录页面 时 会导致我的应用程序脚本出现多个实例 app ph
  • 在 GCP API 网关上使用 Google 访问令牌进行身份验证

    我正在尝试使用 Google 在 GCP API Gateway 上执行身份验证访问令牌 ya29 OAuth2 但是 那文档 https cloud google com api gateway docs authenticating u
  • 如何安装 Haskell 控制镜头

    我注意到 Control Lens 不是 Haskell 平台的一部分 所以我可能需要安装它 谁能解释一下如何安装吗 它不是 Haskell 平台的一部分吗 编辑 我正在使用 GHCi 它使用 prelude 警告 此答案仅适用于版本 3
  • 隐藏 primefaces 表列标题

    我有一个 p treeTable 树内容都在一列中 该树是一个共享组件 因此我的某些页面需要列标题 而有些则不需要 在列标题为空的页面中 它为列标题创建一个空行 这是我不想要的 我确实想要列内容 只是没有列标题时不需要标题 我怎样才能解决这
  • 从 Pyspark LDA 模型中提取文档主题矩阵

    我已经通过 Python API 在 Spark 中成功训练了 LDA 模型 from pyspark mllib clustering import LDA model LDA train corpus k 10 这工作得很好 但我现在需
  • 直接转到 URL 时,AngularJS 路径中带有参数的路由不会在 HTML5 模式下加载

    我指定了几条路线 app config routeProvider locationProvider function routeProvider locationProvider routeProvider when templateUr
  • 杀死 OpenCL 内核

    有没有办法通过 OpenCL API 终止正在运行的 OpenCL 内核 我在规范中没有找到任何内容 我能想到的唯一解决方案是 1 定期检查内核中主机希望内核停止时写入的标志 或 2 在单独的进程中运行内核并终止整个进程 我认为这两个都不是
  • ASP.NET 通过部分 ID 查找控件

    我的 html 中有这个 div div class myValue div 我动态添加我的单选按钮到那个div像这样 HtmlGenericControl div null foreach DataRow row in results R
  • 查找 unique_ptr 集合的原始指针

    我经常发现自己想要编写这样的代码 class MyClass public void addObject std unique ptr newObject void removeObject const Object target priv
  • 请求送达回执时,CDO 消息不会发送

    我正在用经典 ASP 编写一个应用程序 是的 请原谅我 它使用 Google Mail 发送电子邮件 我让它工作得很好 如下所示 Dim ObjSendMail Set ObjSendMail CreateObject CDO Messag
  • Apache服务器安装失败(端口80或443已在使用)

    我有一个与 PHP 相关的问题 我是 net 开发人员 我通常使用 asp net 和 c 我在笔记本电脑上安装了 Visual Studio 和 SQL Server 现在我尝试在我的系统上安装 Xampp 服务器 这里我遇到了一些问题
  • 回发后在 GridView 中保留数据源

    所以我的 ASPX 页面中有一个 GridView 当我点击
  • 如何将带有 HTML 标签的文本拆分为数组

    我有非常简单的 HTML 文本 仅 b 标签 例如 Lorem Ipsum is b simply dummy b text of the printing and b typesetting industry b 我想将文本拆分为数组 如
  • jQuery 漏洞(NVD CVE-2007-2379)

    我们正在使用 jQuery 我在国家漏洞数据库中发现了以下 jQuery 漏洞 http web nvd nist gov view vuln detail vulnId CVE 2007 2379 http web nvd nist go
  • EF Core 2.0 迁移 - 具有附加字段的多对多

    我正在使用 EF Core 2 0 并创建了与联接实体的多对多关系 当我添加新的迁移 EF 时 总是会创建一个额外的索引 Id 字段 这是完全愚蠢的 这是我的加入实体 public class Team Member public int