【问题标题】:Why does PersistentObjectSpace sometimes return a proxy and sometimes return an object?为什么 PersistentObjectSpace 有时会返回代理,有时会返回对象?
【发布时间】:2021-07-20 07:52:16
【问题描述】:

调试器在下面的代码中告诉我

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

【问题讨论】:

    标签: entity-framework xaf


    【解决方案1】:

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

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

    如果我运行代码:

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

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

    var imageName = product.ProductImage.Name; 
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-22
      • 2019-12-26
      • 2015-09-01
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      相关资源
      最近更新 更多