延迟加载EF MVC的问题

时间:2017-01-18 08:33:07

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

我在EF中遇到一些相关实体的问题。

这是我的产品类:

public class Product
{
    public int Id { get; set; }
    public int AtpID { get; set; }
    public int SupplierID { get; set; }
    public string AtpName { get; set; }
    public string Name { get; set; }
    public string ArticleNo { get; set; }
    public string SupplierNo { get; set; }
    public string AtpPrice { get; set; }
    public string AtpStock { get; set; }
    public string AtpDeliveryDays { get; set; }
    public bool FitsAllCars { get; set; }
    public int? CategoryId { get; set; }

    public virtual ICollection<ProductReference> ProductReferences { get; set; }
    public virtual ICollection<ProductDetail> ProductDetails { get; set; }
}

这是ProductDetails类:

public class ProductDetail
{
    public int Id { get; set; }

    [ForeignKey("ProductId")]
    public virtual Product Product { get; set; }
    public int ProductId { get; set; }

    public int ProductDetailTypeId { get; set; } 
    public int ProductDetailKeyId { get; set; }       
    public string AtpTextKey { get; set; }
    public string AtpTextValue { get; set; }
    public string TextKey { get; set; }
    public string TextValue { get; set; }
    public bool IsVisible { get; set; }
    public bool Checked { get; set; }

}

问题是没有为产品加载ProductDetails,正如您在附带的屏幕截图中看到的那样,它给了我一个错误:

enter image description here

正确加载ProductReferences,只有ProductDetails我才遇到这个问题。 你能帮我解决这个问题吗?我不知道是什么原因导致了这个问题。 谢谢!

3 个答案:

答案 0 :(得分:1)

请在选择时使用Include:

 _context.Product.Include('ProductDetails').ToList()

如果您想启用延迟加载,请检查    这是在DBContext类中设置的,如果为false,则不会加载。然后你需要使用我的回答

中提到的Eager Loading
  this.Configuration.LazyLoadingEnabled = true; 

答案 1 :(得分:1)

包含ProductDetails,如下所示:

var products = await _ctx.Products
                .Include(p => p.ProductDetails)
                .ToListAsync();

答案 2 :(得分:0)

我猜你遇到了循环引用引起的异常。请注意,Product包含对ProductDetails的引用,而ProductDetails则包含对Product的引用。当您尝试序列化此聚合(对象图)时,将抛出循环引用异常。

最佳方法是使用DTO仅传输您要在特定视图中使用的数据。 DTO应该只具有简单的属性,因此不会创建循环引用错误。