如何禁止因序列化而延迟加载子对象?

时间:2015-05-11 19:00:12

标签: c# entity-framework-5 asp.net-web-api

我正在使用Entity Framework将数据撤回到Web API服务中公开。我们的Model有一个ProductDetails对象,它有一个Product对象,它有一个Category对象。因此,在我的Get操作调用的上下文中,我要求它包含Product(但不包括Category):

results = context.ProductDetails.Include("Product");

所以,在我的服务结果中,我得到了(XML缩短了输入时间):

<ProductDetails>
    ...
    <Product>
        ...
        <Category>
            <Name>Example Category name</>
            ...
        </>
        <CategoryId>1</>
    </>
    <ProductId>17</>
 </>

我认为序列化导致Category得到“延迟加载”,即使我真的不想要它。我如何避免得到比我要求更多的东西?我想得到:

<ProductDetails>
    ...
    <Product>
        ...
        <Category i:nil="true"/>
        <CategoryId>1</>
    </>
    <ProductId>17</>
 </>

如何查询(或告诉序列化程序)保留CategoryId但不检索完整的类别?

编辑,参考,这是产品的型号:

[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; }

    ...
}
编辑:我的行为有些不一致 - IIS重置后的第一次加载,数据就像我想要的那样。如果我重新加载页面,突然分类已完全填充。这是一个线索吗?

1 个答案:

答案 0 :(得分:1)

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

value="{{dataLine}}"

您最终应该使用包含CategoryId的序列化对象,而不是Category对象本身。