为什么 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) 这确实意味着任何引用都需要预先加载或显式加载,因为如果没有代理,延迟加载将无法运行。
调试器在下面的代码中向我展示了这一点
_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) 这确实意味着任何引用都需要预先加载或显式加载,因为如果没有代理,延迟加载将无法运行。