gpt4 book ai didi

c# - Entity Framework Core 3,无需连接即可获取外键

转载 作者:行者123 更新时间:2023-12-04 01:23:03 32 4
gpt4 key购买 nike

使用 EF Core 我想在不连接这些表的情况下获取外键。

我有两个表:

  • 用户 [id, name, system(FK)]
  • 系统 [id, name]

  • 我希望能够获取 System 的外键来自 Users table 。如果没有选择 FK 以外的其他属性,我会认为 EF 会足够聪明以删除连接,但这不是我在测试时看到的。

    我试过:
    var userSystem = DBContext.Users
    .Where(a => a.Id == 1)
    .Select(a => new { UserId = a.id, SystemId = a.system.Id })
    .FirstOrDefault();

    但是查看生成的 SQL 查询,它在系统表上包含一个不必要的 LEFT JOIN。关于如何让 EF 在没有连接的情况下生成代码的任何想法?

    注意:在这个例子中,join 显然不是问题,但我还有其他查询,其中有很多 FK 被提取,但具有严格的性能要求。

    最佳答案

    它曾经足够聪明(并且将来可能会如此),但是 EF Core 3.x 查询管道重写出现了问题,因此目前它会为此和许多其他情况生成不必要的连接(尤其是对于具有表的拥有实体类型 split )。

    在 v3.x 中解决它的唯一方法是使用 EF.Property方法,这需要知道影子 FK 属性名称及其类型。这当然不好且容易出错,但这是当前 EF Core 缺陷的代价。

    在你的情况下,它可能是这样的:

    SystemId = EF.Property<int?>(a, "systemId")

    通过从 EF Core 元数据中检索,可以避免硬编码 FK 属性名称:
    var fkPropertyName = DBContext.Model
    .FindEntityType(typeof(User))
    .FindNavigation(nameof(User.system))
    .ForeignKey.Properties[0].Name;

    进而
    SystemId = EF.Property<int?>(a, fkPropertyName)

    不过,您仍然需要对类型进行硬编码。

    当然,您可以通过在实体模型中定义和使用显式 FK 属性来避免这一切。

    关于c# - Entity Framework Core 3,无需连接即可获取外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62337684/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com