【问题标题】:ASP.NET Core FindByAsync doesn't load navigation propertiesASP.NET Core FindByAsync 不加载导航属性
【发布时间】:2018-03-01 18:34:29
【问题描述】:

我在使用 EF 2.0 的 ASP.NET Core 2.0 应用程序中有一个 AppUser 类

用户可以发送和接收消息,我有一个方法可以获取最新消息的最新日期,如果有的话:

    public IEnumerable<Message> MessagesSent { get; set; }
    public IEnumerable<Message> MessagesReceived { get; set; }

    public DateTime DateOfLastMessage()
    {       
        var sentDate = new DateTime();
        var receivedDate = new DateTime();
        if (MessagesSent != null)
        {
            sentDate = this.MessagesSent.Select(x => x.Created).Last();
        }
        if (MessagesReceived != null)
        {
            receivedDate = this.MessagesReceived.Select(x => x.Created).Last();
        }


        return (sentDate > receivedDate ? sentDate : receivedDate);
    }

但是,当我使用以下方式加载用户时:

_userManager.FindByIdAsync(relevantContact).Result;

然后导航属性不会加载,因此 DateOfLastMessage 函数将始终是 DateTime 最小值。

我该如何解决这个问题? (顺便说一句,我的方法可以简化吗……?)

【问题讨论】:

  • 为什么将IEnumerable 用于导航属性?应该只是List 吗?看看article关于导航属性。
  • OT:你为什么使用.Result? (你不应该)。
  • 哪些导航属性?您的 2 个代码 sn-ps 之间的联系尚不清楚。更好地记录它,或创建一个minimal reproducible example
  • @IgorYalovoy 感谢您的提示
  • @HenkHolterman 我使用结果,因为我需要用户作为下一个查询的参数(未显示)。有没有更好的办法?

标签: c# asp.net asp.net-core


【解决方案1】:

_userManager 不知道也不关心您在 User 类中拥有的其他导航属性。

如果你想加载这些属性,你有几个选择。

  • 使用可查询的_userManager.Users.Include(x =&gt; x.MessagesSent).Include(x =&gt; x.MessagesReceived)
  • 创建您自己的 UserManager 并覆盖 FindByIdAsync() 方法并将其注册以进行依赖注入。
  • 使用DbContext直接查询Users数据。

【讨论】:

猜你喜欢
  • 2022-01-04
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
相关资源
最近更新 更多