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

2024-01-02

实体框架核心中有一个有趣的功能:

Entity Framework Core 将自动修复导航属性 到先前加载到上下文中的任何其他实体 实例。因此,即使您没有明确包含 a 的数据 导航属性,如果某些或 所有相关实体均已预先加载。

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

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

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工作正常。考虑到这些,我应该更改什么才能实际测试我的导航属性是否正常工作?


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

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


如果您想使用内存数据存储测试导航属性,则需要使用“非跟踪”模式加载项目AsNoTracking()扩大。

所以,对于你的情况,如果var loaded = ctx.Model1s.Single(m => m.Id == 777);返回带有关系的项目,而不是重写为:
var loaded = ctx.Model1s.AsNoTracking().Single(m => m.Id == 777);这将返回您没有依赖的原始项目。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架核心:使用内存数据存储时如何测试导航属性加载 的相关文章

随机推荐