实体框架-显示不包含的相关实体

本文关键字:实体 包含 框架 显示 | 更新日期: 2023-09-27 18:24:35

我正在开发代码优先的EF6应用程序,在包含相关实体方面有一个问题。

我有这样的模型:

public class Product
{
    [Key]
    [JsonProperty(Order = 0)]
    [JsonIgnore]
    public int ProductID { get; set; }
    [Required]
    [JsonProperty(Order = 1)]
    public string Name { get; set; }
    [Required]
    [JsonProperty(Order = 2)]
    public virtual Shop Shop { get; set; }
    [Required]
    [JsonProperty(Order = 3)]
    public virtual ProductCategory Category { get; set; }
    [Required]
    [JsonProperty(Order = 4)]
    public double Price { get; set; }
    [JsonProperty(Order = 5)]
    public double? OldPrice { get; set; }
}

我的上下文有一个数据库集,如:

public System.Data.Entity.DbSet<PromoCeny.Models.Product> Products { get; set; }
public System.Data.Entity.DbSet<PromoCeny.Models.ProductCategory> ProductCategories { get; set; }
public System.Data.Entity.DbSet<PromoCeny.Models.Shop> Shops { get; set; }

我试图访问所有Product对象,如:

db.Products

我得到了Products的列表,但属性ShopCategory都是null

这很奇怪,但我有一个可行的解决方案,其中像这样的东西会产生合适的对象(所有属性都设置正确),但我找不到这些项目之间的区别。

我试图从模型中的属性中删除virtual标志,但这也不起作用。

当然,我可以得到产品列表,如:

db.Products.Include(product => product.Shop).Include(product => product.Category)

但我想避免这种情况。

你知道怎么处理吗?

编辑:

我刚刚发现我已经禁用了实体的惰性加载。

我删除了类似:

this.Configuration.LazyLoadingEnabled = false;

来自Context,它现在正在工作。

实体框架-显示不包含的相关实体

我认为你需要禁用延迟加载,只要你的关系定义正确,我认为这应该强制加载链接的属性。

您所经历的行为是由延迟加载特性引起的。这可以在您的上下文中禁用,如下所示:

public class MyContext : DbContext 
{ 
    public MyContext() 
    { 
        this.Configuration.LazyLoadingEnabled = false; 
    } 
}

请注意,这会关闭所有内容的懒惰加载;如果对象图高度互连,那么查询可能会变得非常慢,因为即使是简单的查询最终也可能加载大量数据。

从集合属性中删除virtual修饰符应该禁用该属性的延迟加载,但您说它不。。。要进行诊断,我们需要更多关于EF配置的信息。