【问题标题】:EF Core NullReferenceException on Related Navigation Property相关导航属性上的 EF Core NullReferenceException
【发布时间】:2020-07-04 15:49:18
【问题描述】:

我有两个相关的模型。

    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; }
    }

我正在尝试创建一个 MVC 表单,其中包含一个选择的 HTML 元素,其中对优惠和产品进行分组 并将产品名称用作 optgroup。 为此,我有一个视图模型,我打算用分组的优惠填充它,我有一个方法 这样做。

        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.Product 为 null,即使 o.ProductID 中有一个值。

GroupBy 之前的ToList() 呼叫没有帮助。

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

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

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

也没有使错误消失。

我还有什么遗漏的吗?

任何帮助将不胜感激。

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

【问题讨论】:

  • @AliK 请原谅我,但我认为 _context.Offers.Include(o => o.Product) 正是这样做的。包括相关产品。还是我错过了什么?
  • 尝试使用 _context.Offers.Include("Product") 代替
  • 这能回答你的问题吗? Entity Framework Include() is not working
  • @MohammadAli 感谢您的建议,但这些修复对我不起作用。
  • @MohammadAli 我找到了解决方法。将其发布为答案。再次感谢您的建议。

标签: c# asp.net-core entity-framework-core asp.net-core-mvc ef-core-3.1


【解决方案1】:

我终于解决了。

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

所以我改变了

public int ProductId { get; set; }

public long ProductId { get; set; }

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-22
    • 2018-10-10
    • 2018-05-09
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    相关资源
    最近更新 更多