相关导航上的 EF Core NullReferenceException 属性

EF Core NullReferenceException on Related Navigation Property

我有两个相关的模型。

    public class Offer
    {
        public long Id { get; set; }
        public string OfferCode { get; set; }
        public string Description { get; set; }

        // more properties

        public int ProductId { get; set; }
        public virtual Product Product { get; set; }
    }

    public class Product
    {
        public long Id { get; set; }
        public string Name { get; set; }

        // more properties

        public virtual ICollection<Offer> Offers { get; set; }
    }

我正在尝试使用包含 select HTML 元素的 MVC 表单,其中对商品和产品进行分组 并将产品名称用作 optgroups。 为此,我有一个视图模型,我打算用分组的 Offers 填充它,并且我有一个方法 做到这一点。

        private OfferMessageViewModel PrepareViewModel(OfferMessageViewModel viewModel)
        {
            var offers = _context.Offers.Include(o => o.Product).ToList()
                .GroupBy(o => o.Product.Name).ToList();

            foreach (var offerGroup in offers)
            {
                var optionGroup = new SelectListGroup
                {
                    Name = offerGroup.Key
                };

                foreach (var offer in offerGroup)
                {
                    viewModel.Offers.Add(
                        new SelectListItem
                        {
                            Value = offer.OfferCode,
                            Text = offer.Description,
                            Group = optionGroup
                        }
                    );
                }
            }
            return viewModel;
        }

代码在 GroupBy 子句中出错。 即使 o.ProductID 中有值,o.Product 也为 null。

GroupBy 之前的 ToList() 调用没有帮助。

我尝试删除相关实体的 virtual 修饰符 导航属性,但错误仍然存​​在。

安装 NuGet 包 Microsoft.EntityFrameworkCore.Proxies 和 像这样修改和配置它

services.AddDbContext<ApplicationDbContext>(options =>
                options.UseLazyLoadingProxies() 
                .UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));

也没有使错误消失。

还有什么我想念的吗?

如有任何帮助,我们将不胜感激。

编辑: 有人建议我的 post 可能会被这个 SO question 解决。但是即使显式打开延迟加载,我也会得到空引用异常。 我已经尝试了那里建议的解决方案,但仍然没有成功。

我终于解决了。

显然问题是外键是 int 引用类型为 long 的主键。

所以我改变了

public int ProductId { get; set; }

public long ProductId { get; set; }

Offer 模型中。 添加了必要的迁移,更新了数据库,现在它可以工作了。 不再有空引用异常。

不知道为什么我错过了,但这可能是睡眠不足和 一条不太有用的错误消息让我转向完全不同的方向。