使用DbContext和Load加载到内存中的数据库条目会发生什么情况



使用Load()加载记录后,我不知道这些记录要去哪里。这些记录从哪里加载?是否可以从layerstmp1变量访问它们?最终,该方法返回layers变量,但query和dbContext的情况似乎不会影响layers变量:

var layers = dbContext.DataLayer.Where(x => layerIds.Contains(x.DataLayerId)).ToList();
var tmp1 = dbContext.XYDateRelationshipUnderDI
.Where(x => x.XYDatedDI.Dated && layerIds.Contains(x.XYDatedDI.DataFeature.LayerId))
.ToList()
.Select(x => x.XYRelationshipId);
var query = dbContext.XYValueHolder
.Where(x => tmp1.Contains(x.XYRelationshipId))
.Where(x => x.XYValues.Count > 0);
// ...
query.Where(x => x.XYValues.Average(x => x.X) > item.ThresholdValue).Load();
// ...
dbContext.XYDatedDI
.Where(x => tmp1.Contains(x.XYRelationshipUnderDI.XYRelationshipId)).Load();
return layers;

我在网上看到的大多数例子都与对单个实体或DbSet使用Load方法有关。我是C#和实体框架的初学者,所以我正在调试的文件中的这段代码让我有点困惑。

更改跟踪器跟踪从数据库加载的每个对象实例。加载对象时,更改跟踪器会根据外键值将导航属性链接在一起。

例如,如果您的layers变量包含具有外键的对象,这些外键指向其他.Load()调用加载的任何对象,则相关对象将在内存中链接。

然后,当您修改对象的属性时,更改跟踪器会检测您的更改,然后用于生成sql,将这些更改应用于数据库。

您可以从context.ChangeTracker.Entries()检查更改跟踪器中的所有对象,或者通过context.dbset.Local通过其DbSet查询加载的实例。

检查以下内容:

https://stackoverflow.com/a/18032219/1559611

DbContext是一个实体框架对象,它产生了IQueryable<T>,它就像查询数据的游标,它实时执行查询,通过游标访问。

现在,可以选择将IQueryable<T>转换为IEnumerable<T>,这是基本接口,指的是在内存中加载数据。

当您调用.Load().ToList()时,数据会像List<T>一样一次加载到内存结构中。使用类似Load()的东西的唯一好处是子数据,并且通过使用Include,引用的数据也会加载到内存中以进行快速访问

也检查一下:

DbContext显式加载

因此,区别在于显式加载内存结构或通过光标访问内存结构(延迟加载),这两种机制都有其优缺点和特定的用例。

这两个数据点都是特定于调用的,一旦调用结束,它们就会消失,直到并且除非有缓存来检索它,但通常缓存对于内存中的数据很有用,比如dbcontext连接池在内部使用,以避免代价高昂的重新初始化。

  1. 加载到内存中的数据在各种操作中都很快,因为没有网络调用,所有网络惩罚都是一次性加载数据。

  2. 对于基于光标的方法,有一个网络调用来获取每个数据单元,尽管它很小,可以分块以避免过多的网络调用,但应用程序只能处理加载在内存中的数据

相关内容

最新更新