在个别通话中排除子实体

时间:2018-07-25 14:02:09

标签: c# entity-framework lazy-loading

默认情况下,我希望对SQL的Linq调用包含子实体,因此我将LazyLoadingEnabled设置为true。 在一小部分呼叫中,我只想返回父实体,而不包括相关的子实体。 我尝试在linq查询之前将LazyLoadingEnabled设置为false,然后在之后将其设置为true,但这没有任何效果。

有没有办法做到这一点?

示例模型:

public class UserProjectInternalMember
{
    [Key, Column(Order = 0), ForeignKey("UserProject")]
    public int UserProjectId { get; set; }

    [Key, Column(Order = 1), ForeignKey("User")]
    public string UserId { get; set; }

    [Column(Order = 2), ForeignKey("UserProjectMembershipLevel")]
    public int UserProjectMembershipLevelId { get; set; }

    public virtual UserProject UserProject { get; set; }
    public virtual ApplicationUser User { get; set; }
    public virtual UserProjectMembershipLevel UserProjectMembershipLevel { get; set; }

    [NotMapped]
    public bool CanEdit { get; set; }

    [NotMapped]
    public bool CanRemove { get; set; }
}

2 个答案:

答案 0 :(得分:1)

首先,让我们澄清一下隐藏在第一句话中的误解:

  

默认情况下,我希望对SQL的Linq调用包含子实体,因此我将LazyLoadingEnabled设置为true

  1. 默认为延迟加载。要禁用它,必须将其设置为false
  2. 延迟加载不 include 个子实体。稍后,当访问导航属性并且上下文仍处于活动状态时,它将加载它们。 (并启用了延迟加载)。
  3. 实体框架!= LINQ-to-SQL。

现在是关于您的问题。

实体对象由具有或不具有延迟加载功能的上下文创建。此决定由设置context.Configuration.ProxyCreationEnabled而不是LazyLoadingEnabled 来控制。实现后,实体对象的命运就被密封了:它有能力或没有能力进行延迟加载。

在能够进行延迟加载的对象中访问延迟加载导航属性时,如果上下文仍处于活动状态并且当时具有LazyLoadingEnabled = true (并非在创建对象时)。

这就是为什么翻转LazyLoadingEnabled的值并没有达到您预期的效果的原因。如果要创建永远不会延迟加载的对象,则必须在ProxyCreationEnabledfalse时创建它们。

答案 1 :(得分:0)

您可以在上下文中动态更改延迟加载

yourDBContext.Configuration.LazyLoadingEnabled = false;

或者,如果您只想为特定的导航属性禁用它,则只需将该属性设为非虚拟。

或者,我更喜欢的另一种方法是完全禁用延迟加载,并在需要时使用紧急加载。