有关导航属性的EF核心NullReferenceException

时间:2020-03-24 06:50:37

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

我有两个相关模型。

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

我正在尝试使用带有选择的HTML元素的MVC表单,在该表单中将商品和商品分组 并将产品名称用作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中有一个值,o.ProductID也为空。

ToList()之前的GroupBy呼叫无济于事。

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

安装NuGet软件包Microsoft.EntityFrameworkCore.Proxies和 如此修改和配置

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

也没有使错误消失。

还有其他我想念的东西吗?

任何帮助将不胜感激。

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

1 个答案:

答案 0 :(得分:1)

我终于解决了。

显然,问题在于外键是一个Theta(N),引用了类型为int的主键。

所以我改变了

long

public int ProductId { get; set; }
public long ProductId { get; set; } 模型中

。 添加了必要的迁移,更新了数据库,现在它可以工作了。 没有更多的空引用异常。

不知道为什么我会错过它,但这可能是缺乏睡眠和 一条不太有用的错误消息使我朝完全不同的方向前进。