默认情况下,我希望对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; }
}
答案 0 :(得分:1)
首先,让我们澄清一下隐藏在第一句话中的误解:
默认情况下,我希望对SQL的Linq调用包含子实体,因此我将LazyLoadingEnabled设置为true
false
。现在是关于您的问题。
实体对象由具有或不具有延迟加载功能的上下文创建。此决定由设置context.Configuration.ProxyCreationEnabled
而不是LazyLoadingEnabled
来控制。实现后,实体对象的命运就被密封了:它有能力或没有能力进行延迟加载。
在能够进行延迟加载的对象中访问延迟加载导航属性时,如果上下文仍处于活动状态并且当时具有LazyLoadingEnabled = true
(并非在创建对象时)。
这就是为什么翻转LazyLoadingEnabled
的值并没有达到您预期的效果的原因。如果要创建永远不会延迟加载的对象,则必须在ProxyCreationEnabled
为false
时创建它们。
答案 1 :(得分:0)
您可以在上下文中动态更改延迟加载
yourDBContext.Configuration.LazyLoadingEnabled = false;
或者,如果您只想为特定的导航属性禁用它,则只需将该属性设为非虚拟。
或者,我更喜欢的另一种方法是完全禁用延迟加载,并在需要时使用紧急加载。