实体框架核心中有一个有趣的功能:
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(使用前将#替换为@)