实体框架核心:如何在使用内存数据存储区时测试导航属性加载

sil*_*der 4 navigation-properties entity-framework-core asp.net-core

实体框架核心中存在一个有趣的特征:

实体框架核心将自动将导航属性修复到先前加载到上下文实例中的任何其他实体.因此,即使您没有明确包含导航属性的数据,如果之前加载了部分或全部相关实体,仍可能会填充该属性.

在某些情况下这很好.然而,目前我正在尝试使用高级语法添加来建模多对多关系,并且不想检查,我创建的映射效果很好.

但我实际上不能这样做,因为如果让我说我有类似的东西:

class Model1{
   ... // define Id and all other stuff
   public ICollection<Model2> Rel {get; set;}
}

Model1 m1 = new Model1(){Id=777};
m1.Rel.Add(new Model2());
ctx.Add(m1);
ctx.SaveChanges()

var loaded = ctx.Model1s.Single(m => m.Id == 777);
Run Code Online (Sandbox Code Playgroud)

因此,由于自动修复loaded.Rel字段已经填充,即使我不包含任何内容.所以有了这个功能,我实际上无法检查任何内容.无法检查我是否使用了正确的映射,并且我的添加Include工作正常.考虑到这一点,我应该更改哪些能够对我的导航属性进行正常测试?


我创建了一个应该通过的测试用例,但现在失败了.那里可以找到确切的代码

我正在使用.Net Core 2.0预览1和EF核心.

Ph0*_*n1x 5

如果要使用内存数据存储测试导航属性,则需要使用AsNoTracking()扩展名以"非跟踪"模式加载项目.

所以,对于你的情况,如果 var loaded = ctx.Model1s.Single(m => m.Id == 777);你的项目返回关系,那么你重写为:
var loaded = ctx.Model1s.AsNoTracking().Single(m => m.Id == 777);这将返回没有deps的原始项目.

那么如果你想Include再次检查,你可以写一些类似的东西ctx.Model1s.AsNoTracking().Include(m => m.Rel).Single(m => m.Id == 777);,这将返回你包含的关系的模型.