繁体   English   中英

禁用延迟加载实体框架导航属性

[英]Disable Lazy-Load Entity Framework Navigation Properties

是否有任何方法可以使当尝试访问未明确包含.include()的导航属性时,从DbContext查询返回的实体返回null(或其他特定值)? 例如:

var parents = dbContext.People.Where(p => p.Children.Any()).Include("Children").ToList();
//Assert all parents have children...
Assert.IsTrue(parents[0].Children.Any());

和...

var parents = dbContext.People.Where(p => p.Children.Any()).ToList();
//Assert all children collections are null... NOT LAZY LOADED
Assert.IsTrue(parents[0].Children == null);

需要明确的是,我不希望该属性被急切加载。 我根本不希望加载它。 我尝试过从上下文中分离实体,但这无济于事。

背景

我尝试执行此操作的原因是,我需要在与创建DbContext的线程不同的线程上访问实体对象。 因此,我不希望将Navigation属性设置为某些延迟执行linq语句。 问题是,由于我无法访问DbContext以检查导航属性是否已加载(由于它不是线程安全的),因此我无法知道是否需要在当前线程上创建新的DbContext来检索丢失的属性数据。 这是我试图解决的相同问题,即如何确定是否在没有DbContext的情况下加载了导航属性

更新资料

将DbContext的Configuration.LazyLoadingEnabled属性设置为false可以防止linq自动连接,但是对于作为集合的导航属性,这将导致一个空集合而不是null。

为了解决基于集合的问题,我修改了T4模板以生成一个空的默认构造函数,而不是将每个ICollection设置为一个空HashSet的默认构造函数。

您可以通过设置DbContextConfiguration.LazyLoadingEnabled属性来启用/禁用延迟加载

context.Configuration.LazyLoadingEnabled = false;
var parents = dbContext.People.Where(p => p.Children.Any()).ToList();
context.Configuration.LazyLoadingEnabled = true;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM