相关导航上的 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
模型中。
添加了必要的迁移,更新了数据库,现在它可以工作了。
不再有空引用异常。
不知道为什么我错过了,但这可能是睡眠不足和
一条不太有用的错误消息让我转向完全不同的方向。
我有两个相关的模型。
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
模型中。
添加了必要的迁移,更新了数据库,现在它可以工作了。
不再有空引用异常。
不知道为什么我错过了,但这可能是睡眠不足和 一条不太有用的错误消息让我转向完全不同的方向。