我正在开发代码第一个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; }
}
我的上下文有一个DBSets,如:
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,它现在正在工作。
答案 0 :(得分:0)
我相信你需要禁用延迟加载,这个,只要你的关系被正确定义,就应该强制链接属性加载我相信。
答案 1 :(得分:0)
您遇到的行为是由延迟加载功能引起的。这可以在您的上下文中禁用,如下所示:
public class MyContext : DbContext
{
public MyContext()
{
this.Configuration.LazyLoadingEnabled = false;
}
}
请注意,这会关闭所有内容的延迟加载;如果您的对象图高度相互关联,您的查询可能会变得非常慢,因为即使是简单的查询也可能最终加载大量数据。
从集合属性中删除virtual
修饰符应该禁用该属性的延迟加载,但是你说它没有...要诊断它,我们需要更多信息在您的EF配置上。