使用 EFCore 设置带有私有字段的自定义外键列名称

2024-02-10

我有以下数据模型:

public class Foo
{
    public Foo(int barId)
    {
        BarId = barId;
    }

    private int BarId;
    public Bar Bar { get; private set; }
}

public class FooTypeConfig : IEntityTypeConfiguration<Foo>
{
    public void Configure(EntityTypeBuilder<Foo> builder)
    {
        builder.HasOne(x => x.Bar)
            .WithMany()
            .HasForeignKey("BarId");
    }
}

public class Bar
{
    public int Id { get; private set; }
}

这很好用,根据我的期望,我有一个Foo表包含Id and BarId。我的私人领域BarId and my Bar阅读时属性也能正确实现Foo从数据库中。

问题是我想找到一种方法来命名我的私有字段,并为我的数据库列选择不同的名称。我想为我的财产命名_barId并仍然选择BarId作为我数据库中的列名。

这可能吗?


我尝试过重命名我的字段Foo类并指定我的(现在非常规命名的)外键_barId in my EntityTypeConfiguration

builder.HasOne(x => x.Bar).WithMany().HasForeignKey("_barId");

但这导致 EF 仍然生成BarId列,而不将其用作外键Bar桌子...

migrationBuilder.CreateTable(
    name: "Foos",
    columns: table => new
    {
        Id = table.Column<int>(nullable: false)
            .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
        BarId = table.Column<int>(nullable: true),
        _barId = table.Column<int>(nullable: false)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_Foos", x => x.Id);
        table.ForeignKey(
            name: "FK_Foos_Bars__barId",
            column: x => x._barId,
            principalTable: "Bars",
            principalColumn: "Id",
            onDelete: ReferentialAction.Cascade);
    });

首先,EF 将数据库列和 FK 映射到实体特性,而不是字段。这些属性可以是真实的,也可以根据您的情况 -shadow https://learn.microsoft.com/en-us/ef/core/modeling/shadow-properties.

所以下面这一行:

builder.HasOne(x => x.Bar).WithMany().HasForeignKey("BarId");

映射Bar -> FooFK 与 a 的关系Foo影子属性称为BarId并且应该保持原样。

您使用Property方法来配置属性类型、支持字段、列名、类型和其他属性。例如:

builder.Property<int>("BarId") // or int? etc.
    .HasField("_barId")
    .HasColumnName("BarId"); // or BazId or whatever you like 

只需确保在定义属性和指定 FK 时使用同一个属性名称即可。您还可以使用Entry(entity).Property(propertyName)获取/设置值,将其标记为已修改等以及EF.Property(entity, propertyName) 在 LINQ to Entities 查询中访问它。

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

使用 EFCore 设置带有私有字段的自定义外键列名称 的相关文章

随机推荐

  • 条码字体与条码打印机字体有什么区别

    有人知道条形码字体 在报告中用作字体 和直接从条形码打印机打印的字体之间的区别吗 为什么条码字体前后要加星号 据我了解 当我们使用条形码打印机时 我们不需要它 为什么不呢 星号字符是规范的一部分Code 39 http en wikiped
  • Nokogiri、open-uri 和 Unicode 字符

    我正在使用 Nokogiri 和 open uri 来获取网页上标题标签的内容 但在处理重音字符时遇到问题 处理这些问题的最佳方法是什么 这就是我正在做的 require open uri require nokogiri doc Noko
  • Rails 4 将登录设计为弹出窗口

    您好 我正在使用设备对用户进行身份验证 我已经按照各种教程在弹出窗口中登录 但我没有成功 任何人都可以详细告诉我如何做到这一点 我已经尝试了各种教程 但没有任何效果 每件事都再次重定向到登录页面 我是 Rails 的新手请帮忙 我无法在同一
  • 价值迭代和策略迭代有什么区别? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在强化学习中 有什么区别策略迭代 and 价值迭代 据我了解 在价值迭代中 您使用贝尔曼方程来求解最优策略 而在策略迭代中 您随机选择一个
  • 为什么使用@PostConstruct?

    在托管 Bean 中 PostConstruct在常规 Java 对象构造函数之后调用 我为什么要使用 PostConstruct通过 bean 初始化 而不是常规构造函数本身 因为当调用构造函数时 bean 尚未初始化 即没有注入依赖项
  • 如何在 Visual Studio 2008 中关闭 RTTI

    我不确定其他版本 但是 在 VS 2008 中 即使禁用了 RTTI 我也可以通过调用来查询信息typeid T name 关于类型 它适用于所有类型 包括内部类型和用户创建的类型 我们的项目禁用了 RTTI 但我惊讶地发现这仍然有效 这是
  • 如何在批量插入之前将 .csv 文件中的日期转换为 SQL 格式

    我有一个 csv 文件 其中包含几千个游戏日期 但它们都是 MM DD YYYY 格式 2 27 2011 3 05 PM 26 14 26 和 14 是团队 ID 尝试将它们放入 SQL 中只会导致 0000 00 00 被放入我表的日期
  • Google 操作模拟器不适用于标准 Google Assistant 功能

    我已经使用 Actions on Google 2 5 0 和dialogflow fulfillment 0 6 1 Node js 库构建了一个操作 我无法在对话框流测试控制台上测试我的应用程序 因为我返回那里不支持的 conv 对象
  • 编译器不遵循 Visual Studio C++ 中的符号链接

    我正在使用 Visual Studio 2008 C 项目 Visa 32 位 我有以下内容 include我的源代码中的指令 include
  • 克隆 git 存储库时出现 RSA 主机密钥警告

    我正在使用 git bash 克隆我的 github 存储库并不断收到警告 我正在使用 SSH 所以 我使用这个 git 命令 git clone email protected cdn cgi l email protection Tap
  • 启用迁移 - 无法将参数绑定到参数“路径”

    我是 ASP NET 新手 正在尝试使用实体框架设置 webAPI C 应用程序 但是当我尝试在 nuget package manager 控制台上运行 Enable Migrations 命令时 出现以下错误 无法将参数绑定到参数 Pa
  • Android - 播放视频的不同方式

    我刚刚遇到了 VideoView 的限制 无法播放宽度超过 320 像素的 mp4 视频文件 我想知道我们如何才能克服这些限制 我试图让我的应用程序尽可能宽容 所以除了使用 VideoViews 之外 还有其他方法来播放这些 mp4 视频吗
  • jmeter HTTP响应代码:org.apache.http.conn.HttpHostConnectException,非HTTP响应消息:连接被拒绝错误

    我正在使用 JMeter 测试负载 我正在使用 Amazon Server 当我测试 400 个并发用户的负载时 我收到错误消息 HTTP response code org apache http conn HttpHostConnect
  • 检测 Symfony2 中的实体配置错误

    好吧 我不知道如何修复项目中的错误 我正在尝试处理具有多对多属性关系的嵌套表单 错误表明它无法创建关联 因为其中一侧需要 ID 好吧 所以我尝试只创建缺失的一面 但仍然是同样的错误 最后 我意识到这个简单的代码仍然存在同样的问题 publi
  • 如何在 MPMoviePlayerController iPhone 中关闭音频

    如何关闭和打开 MPMoviePlayerController 的音频 我尝试了 useApplicationAudioSession 这个属性 即使它不起作用 你能帮我么 回答永远不会太晚 对吗 我也在寻找一种方法来做到这一点 我花了一段
  • git fetch 使用路径而不是远程

    我明白跑步的意义git fetch
  • wordpress .htaccess 重写 url

    我正在为我的 WordPress 网站开发测验部分 我的网站上安装了 W3 总缓存 我想进行测验 http www example com quiz seo friend title id http www example com quiz
  • Oracle:非池连接和 DRCP 之间的区别

    我实际上正在读书Oracle cx Oracle http www oracle com technetwork articles dsl python 091105 html教程 在那里我遇到了非池连接和 DRCP 基本上我不是 DBA
  • 使用 SavedStateHandle 引用共享视图模型

    我有单个活动应用程序和片段数量 其中一些片段正在使用我的视图模型 通常如下所示 private val myViewModel MyViewModel by sharedViewModel 如果我想同时拥有模型怎么办shared并用 Sav
  • 使用 EFCore 设置带有私有字段的自定义外键列名称

    我有以下数据模型 public class Foo public Foo int barId BarId barId private int BarId public Bar Bar get private set public class