【问题标题】:Entity Framework Core: foreign key was set and is recalled as null实体框架核心:外键已设置并被召回为空
【发布时间】:2020-04-14 15:09:17
【问题描述】:

我首先生成一个刷新令牌并通过 Entity Framework Core 将其存储在 SQL Server 中,如下所示:

var refreshToken = new RefreshToken { User = user, Token = Guid.NewGuid().ToString() };
_context.RefreshTokens.Add(refreshToken);
_context.SaveChanges();

_context 继承自 Microsoft.EntityFrameworkCore.DbContext

此时_context.RefreshTokens.ToList(); 中有一项。 IdTokenUser都不是空的,我可以访问User中的数据。

另一个 API 端点被调用,在里面我得到如下的 RefreshTokens 列表

var l = _context.RefreshTokens.ToList();

l.Id 已填充,l.Token 已填充,l.User 为空。

这会造成问题,因为我需要访问与 RefreshToken 关联的用户

我已尝试获取_context.Users.ToList();,并且之前设置的用户出现在此列表中。

我最初的假设是 EF 可能在需要之前不会查询 user,所以我尝试从上面的 sn-p 中获取 l.User.Id,但错误如下。

System.NullReferenceException:对象引用未设置为对象的实例

为什么我刚刚保存的实体中的字段在调用时为空?

【问题讨论】:

  • var l = _context.RefreshTokens.Include(t => t.User).ToList();

标签: c# entity-framework-core asp.net-core-webapi


【解决方案1】:

l.Id 已填充,l.Token 已填充,l.User 为空。

l.Id 很可能(您不必费心给我们对象定义)一个 int 或其他东西。 l.Token 是一个 Guid,所以是另一种原始类型。

l.User 是一个对象。除非在查询中包含(通过 .Include),否则不会加载引用的对象。想想看——如果所有引用的对象都会被自动加载,那么你总是会加载所有引用——这会进入“整个数据库”。您的工作是 .Include 您想要包含的内容。

_context.RefreshTokens.Include (x => x.User).ToList()

告诉 EfCore 其中包括您想要获取的其他对象。您可以使用多个包含并包含多个深度级别。很快(EfCore 5.0)就可以使用您从第三方从 nuget 下载的扩展程序,您还可以过滤通过包含加载的内容。

【讨论】:

    【解决方案2】:

    使用包含方法。

    _context.RefreshTokens.Include(t => t.User).ToList();
    

    更多参考 -> https://docs.microsoft.com/en-us/ef/core/querying/related-data

    【讨论】:

      猜你喜欢
      • 2021-09-03
      • 2020-07-08
      • 2018-07-22
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多