实体框架-显示不包含的相关实体
本文关键字:实体 包含 框架 显示 | 更新日期: 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
的列表,但属性Shop
和Category
都是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配置的信息。