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 你用你包含的关系建模。
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 你用你包含的关系建模。