Entity framework 核心:如何在使用内存数据存储时测试导航 属性 加载

Entity framework core: How to test navigation propery loading when use in-memory datastore

entity framework 核心中存在一个有趣的特性:

Entity Framework Core will automatically fix-up navigation properties to any other entities that were previously loaded into the context instance. So even if you don't explicitly include the data for a navigation property, the property may still be populated if some or all of the related entities were previously loaded.

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

但实际上我做不到,因为假设我有类似的东西:

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);

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


我创建了一个应该通过的测试用例,但现在失败了。 Exact code could be found there

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

如果您想使用内存数据存储测试导航属性,您需要使用 AsNoTracking() 扩展以 "non-tracked" 模式加载您的项目。

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

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