为什么 PersistentObjectSpace 有时 return 是代理,有时 return 是对象?

Why does PersistentObjectSpace sometimes return a proxy and sometimes return an object?

调试器在下面的代码中向我展示了这一点

  _taxRate =
                    PersistentObjectSpace.FindObject<TaxRate>(CriteriaOperator.Parse("[TaxCodeId] = ?", TaxCodeId));

                var _product2 =
                    PersistentObjectSpace.FindObject<Product>(CriteriaOperator.Parse("[ItemId] = ?", ItemId));
         

_taxRate 是 poco 但 _product2 是代理

对象是

[Table("TaxCode")]
[DefaultProperty("TaxCode")]
[ImageName("BO_List")]
public class TaxRate : BasicBo
{
    [Key] public short TaxCodeId { get; set; }
    [Required]
    [RuleRequiredField(DefaultContexts.Save)]
    [StringLength(20, ErrorMessage = "The field cannot exceed 20 characters. ")]
    public string TaxCode { get; set; }
    [Required]
    [RuleRequiredField(DefaultContexts.Save)]
    public decimal Percentage { get; set; }
    

    public override string ToString()
    {
        return TaxCode;
    }
}

[Table("MyExtItem")]
[DefaultProperty("ProductCode")]
[NavigationItem("Config")]
public class Product : BasicBo
{
    [Key]
 
    public int ItemId { get; set; }
    public string ItemName { get; set; }
  
    [Column("Item Number")] public string ProductCode { get; set; }

    [MaxLength(10)] public string UnitName { get; set; }
  
    public int? ProductImageId { get; set; }
   
    [ForeignKey("ProductImageId")] public virtual ProductImage ProductImage { get; set; }
    [ForeignKey("ItemId")] public virtual ExtMaterialProperty ExtMaterial { get; set; }
}

这是将 EF 配置为支持延迟加载时的预期行为。

TaxRate 不包含对其他实体的引用,因此 EF 可以 return 一个具体实例。 Product 包含对其他实体 ProductImage 和 ExtMaterial 的两个引用。

如果我运行代码:

var product = context.Products.Single(x => x.ItemId == itemId);

为了获得产品,EF 使用代理以便在我尝试访问 ProductImage 之类的内容时做好准备。

var imageName = product.ProductImage.Name; 

您可以在 DbContext 上使用 Configuration.ProxyCreationEnabled 禁用代理。 (EF6) 这确实意味着任何引用都需要预先加载或显式加载,因为如果没有代理,延迟加载将无法运行。