Entity Framework 7 Code First - 相关实体/导航属性即使在包含时也不会加载

问题描述 投票:0回答:0

使用 Entity Framework 7 代码 首先,我有两个实体如下:

用户

public string UserId { get; set; }

[ForeignKey(nameof(UserId))]
public Queue Queue { get; set; }

队列

public string QueueId { get; set; }

每个User总是有一个Queue,UserId(User的Key)也正好是Queue的Foreign Key。

每个队列有 0..1 个用户。我知道这听起来很奇怪,但可以将 UserId/QueueId 视为可能用于单个用户或组的电子邮件地址。如果它是一个组,它不会与用户相关联,因为该组的成员是在其他地方制定的。 *因此队列实体上缺少免费的用户属性。

无论如何,我希望能够通过 nav 属性访问用户队列,所以我将它与上面显示的 ForeignKey 属性一起添加,以告诉它使用 UserId。迁移生成了以下代码,据我所知它看起来是正确的:

migrationBuilder.AddForeignKey(
    name: "FK_Users_Queues_UserId",
    table: "Users",
    column: "UserId",
    principalTable: "Queues",
    principalColumn: "QueueId",
    onDelete: ReferentialAction.NoAction);

...and from snapshot:
modelBuilder.Entity("Entities.User", b =>
{
    b.HasOne("Entities.Queue", "Queue")
        .WithMany()
        .HasForeignKey("UserId")
        .OnDelete(DeleteBehavior.Cascade)
        .IsRequired();

    b.Navigation("Queue");
});

但是当我尝试查询用户并让它加载 Queue 属性时,由于某种原因它不会加载它 - 即使表中有匹配的记录,队列仍然为空。

var user = _context.Users
                   .Include(x => x.Queue)
                   .FirstOrDefault(x => x.UserId == userId);

我注意到一些奇怪的事情:

  1. 如果我添加 AsNoTracking(),它神奇地开始工作:
var user = _context.Users
                   .Include(x => x.Queue)
                   .AsNoTracking()
                   .FirstOrDefault(x => x.UserId == userId);
  1. 奇怪的是,我在用户实体上还有其他一对集合,它们的行为都符合预期。如果我包含其中任何一个,它们将被加载并在查询时可用。出于某种原因,这种一对一很奇怪。

我在 EF7 中使用默认值,我认为这是延迟加载,我不想更改它。我只是想了解这种行为。这是预期的吗?我只是在做傻事吗?

谢谢!

entity-framework .net-core
© www.soinside.com 2019 - 2024. All rights reserved.