我有两个相关模型。
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可以解决。但是,即使显式打开了延迟加载,我也得到了空引用异常。 我在那里尝试了建议的解决方案,但还是没有运气。
答案 0 :(得分:1)
我终于解决了。
显然,问题在于外键是一个Theta(N)
,引用了类型为int
的主键。
所以我改变了
long
到
public int ProductId { get; set; }
在public long ProductId { get; set; }
模型中。 添加了必要的迁移,更新了数据库,现在它可以工作了。 没有更多的空引用异常。
不知道为什么我会错过它,但这可能是缺乏睡眠和 一条不太有用的错误消息使我朝完全不同的方向前进。