禁用延迟加载 Entity Framework 导航属性
Disable Lazy-Load Entity Framework Navigation Properties
问题
有没有什么方法可以使从 DbContext 查询返回的实体 returns 为空(或其他一些特定值),当您尝试访问您没有访问的导航 属性 时特别是.Include()?例如:
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 的线程不同的线程上访问实体对象。因此,我不希望将导航 属性 设置为某些延迟执行的 linq 语句。问题是因为我无法访问 DbContext 来检查导航 属性 是否被加载(因为它不是线程安全的)我无法知道我是否需要在当前线程上创建一个新的 DbContext检索丢失的数据。这与我试图用 How to tell if a Navigation Property is loaded without DbContext
解决的问题相同
更新
将 DbContext 的 Configuration.LazyLoadingEnabled 属性 设置为 false 可防止 linq 自动连接,但对于作为集合的导航属性,这会导致一个空集合而不是 null。
为了解决基于集合的问题,我修改了我的 T4 模板以生成一个空的默认构造函数,而不是将每个 ICollection 设置为一个空的 HashSet 的构造函数。
您可以通过设置 DbContext
的 Configuration.LazyLoadingEnabled
属性 来启用/禁用延迟加载
context.Configuration.LazyLoadingEnabled = false;
var parents = dbContext.People.Where(p => p.Children.Any()).ToList();
context.Configuration.LazyLoadingEnabled = true;
问题
有没有什么方法可以使从 DbContext 查询返回的实体 returns 为空(或其他一些特定值),当您尝试访问您没有访问的导航 属性 时特别是.Include()?例如:
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 的线程不同的线程上访问实体对象。因此,我不希望将导航 属性 设置为某些延迟执行的 linq 语句。问题是因为我无法访问 DbContext 来检查导航 属性 是否被加载(因为它不是线程安全的)我无法知道我是否需要在当前线程上创建一个新的 DbContext检索丢失的数据。这与我试图用 How to tell if a Navigation Property is loaded without DbContext
解决的问题相同更新
将 DbContext 的 Configuration.LazyLoadingEnabled 属性 设置为 false 可防止 linq 自动连接,但对于作为集合的导航属性,这会导致一个空集合而不是 null。
为了解决基于集合的问题,我修改了我的 T4 模板以生成一个空的默认构造函数,而不是将每个 ICollection 设置为一个空的 HashSet 的构造函数。
您可以通过设置 DbContext
Configuration.LazyLoadingEnabled
属性 来启用/禁用延迟加载
context.Configuration.LazyLoadingEnabled = false;
var parents = dbContext.People.Where(p => p.Children.Any()).ToList();
context.Configuration.LazyLoadingEnabled = true;