C# 如何禁止由于序列化而延迟加载子对象?

C# 如何禁止由于序列化而延迟加载子对象?,c#,entity-framework-5,asp.net-web-api,C#,Entity Framework 5,Asp.net Web Api,我正在使用实体框架提取数据以在Web API服务中公开。我们的模型有一个ProductDetails对象,它有一个Product对象,它有一个Category对象。因此,在我的Get操作调用的上下文中,我要求它包括产品(但不包括类别): 因此,在我的服务结果中,我得到了例如(XML因键入而缩短): 编辑:我得到了一些不一致的行为——IIS重置后的第一次加载,数据是我想要的。如果我重新加载页面,类别会突然被完全填充。这是一个线索吗?我还怀疑延迟加载是原因,因为序列化程序将访问相关对象的每个属性。也

我正在使用实体框架提取数据以在Web API服务中公开。我们的模型有一个ProductDetails对象,它有一个Product对象,它有一个Category对象。因此,在我的Get操作调用的上下文中,我要求它包括产品(但不包括类别):

因此,在我的服务结果中,我得到了例如(XML因键入而缩短):


编辑:我得到了一些不一致的行为——IIS重置后的第一次加载,数据是我想要的。如果我重新加载页面,类别会突然被完全填充。这是一个线索吗?

我还怀疑延迟加载是原因,因为序列化程序将访问相关对象的每个属性。也许您可以关闭整个上下文的延迟加载,而只使用即时加载?下面显示了如何关闭上下文的延迟加载:

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

您应该以包含CategoryId的序列化对象结束,而不是Category对象本身。

您可以在
产品中显示
类别
的定义吗?我建议通过删除
虚拟
修饰符来强制执行即时加载。您现在必须使用
.Include()
显式加载它,但生成序列化数据将不再包含类别的数据。删除虚拟修饰符不会导致行为更改。还有其他想法吗?我的行为有些不一致——IIS重置后的第一次加载,数据是我想要的。但是,如果我重新加载页面,类别会突然完全填充,就像每次后续加载一样。这是一个线索吗?如果您没有显式地或急切地加载虚拟目录,那么删除虚拟目录应该会为您返回一个
null
值。对于突然出现的数据量,我真的说不出任何有意义的话。您是否有可能创建一个在小型环境中显示这一点的可复制示例?您能否显示用于查询数据库和在EF中配置CategorySqlModel的确切代码?请忽略前面的注释。我检查过了,这已经完成了!懒散是错误的。奇怪的还可能是什么?
<ProductDetails>
    ...
    <Product>
        ...
        <Category>
            <Name>Example Category name</>
            ...
        </>
        <CategoryId>1</>
    </>
    <ProductId>17</>
 </>
<ProductDetails>
    ...
    <Product>
        ...
        <Category i:nil="true"/>
        <CategoryId>1</>
    </>
    <ProductId>17</>
 </>
[Table("PRODUCT", Schema = "MySchema")]
public class ProductSqlModel
{
    private CustomTypeConverter _converter = new CustomTypeConverter();

    [Key]
    [Column("CODE")]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public virtual int? Id { get; set; }

    [Column("CATEGORY_CODE")]
    public virtual int? CategoryId { get; set; }

    [ForeignKey("CATEGORY_ID")]
    public virtual CategorySqlModel Category { get; set; }

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