实体框架 - 在没有包含的情况下替换相关实体

时间:2014-09-26 14:01:41

标签: c# entity-framework

我正在开发代码第一个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的列表,但ShopCategory这两个属性都是null

这很奇怪,但是我有一个有效的解决方案,其中这样的结果会产生正确的对象(正确设置所有属性),但我找不到这些项目之间的区别。

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

当然,我可以获得以下产品列表:

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

但我想避免这种情况。

你知道如何处理吗?

修改

我刚刚发现我已经禁用了实体的延迟加载。

我删除了:

this.Configuration.LazyLoadingEnabled = false;

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您遇到的行为是由延迟加载功能引起的。这可以在您的上下文中禁用,如下所示:

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

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

从集合属性中删除virtual修饰符应该禁用该属性的延迟加载,但是你说它没有...要诊断它,我们需要更多信息在您的EF配置上。