【问题标题】:How to forbid lazy-loading of child object due to serialization?如何禁止由于序列化而延迟加载子对象?
【发布时间】:2015-05-11 19:00:11
【问题描述】:

我正在使用实体框架来拉回数据以在 Web API 服务中公开。我们的模型有一个 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 但不检索完整 Category?

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

[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 重置后的第一次加载,数据是我想要的。如果我重新加载页面,突然类别完全填充。这是线索吗?

【问题讨论】:

  • 你能在Product中显示Category的定义吗?
  • 我建议通过删除 virtual 修饰符来强制加载。您现在必须使用.Include() 显式加载它,但生成序列化数据现在将不再包含类别的数据。
  • 移除虚拟修饰符不会导致行为改变。还有其他想法吗?
  • 我的行为有些不一致 - IIS 重置后的第一次加载,数据如我所愿。但是,如果我重新加载页面,突然类别完全填充,就像每次后续加载一样。这是线索吗?
  • 如果您没有明确或急切地加载它,删除虚拟应该会返回一个 null 类别的值。对于突然的数据填充,我真的不能说任何有意义的事情。您是否有机会创建一个可重现的示例来在缩小的环境中显示这一点?能否显示用于在 EF 中查询数据库和配置 CategorySqlModel 的确切代码?

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


【解决方案1】:

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

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

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

【讨论】:

  • 请忽略之前的评论。我检查了,这已经完成了! LazyLoadingEnabled 为假。奇怪的。还能是什么?
猜你喜欢
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 2011-02-06
相关资源
最近更新 更多