2014-09-26 98 views
0

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

这很奇怪,但我有一个工作解决方案,在这样的东西结果适当的对象(与所有属性设置正确),但我找不到这些项目之间的区别。

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

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

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

但我想避免这种情况。

你知道如何处理吗?

编辑:

刚才我想通了,我有实体的禁用延迟加载。

我已删除,如:

this.Configuration.LazyLoadingEnabled = false; 

从语境和它的工作现在。

+0

我已经想通了。看我的编辑 – Tomasz 2014-09-26 14:14:19

回答

0

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

+0

你的意思是我应该添加'this.Configuration.LazyLoadingEnabled = false; '上下文? – Tomasz 2014-09-26 14:04:32

+0

@Tomasz是的,我相信应该强制加载所有图层。 这是一个有用的链接[MSDN Page](http://msdn.microsoft.com/zh-cn/data/jj574232。aspx) – Pheonyx 2014-09-26 14:05:54

+0

我以为你要么使用include来使初始查询中的相关项目恢复正常,要么延迟加载,以便在请求属性时将它们恢复。如果LazyLoadingEnabled为false且没有包含,则不会获得任何相关属性。 – Mant101 2014-09-26 14:14:03

0

您遇到的行为是由延迟加载功能引起的。这可以在你的情况下被禁用,就像这样:

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

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

除去集合属性virtual修改应禁用延迟加载该财产,但你说这不......要诊断的是,我们需要您的EF配置的详细信息。