我有一个使用代码优先实体的项目。
以下测试通过: -
[TestMethod]
public void TestLazyLoadNewEntity()
{
MyContext context = new MyContext();
UserRoleEntity entity = context.Set<UserRoleEntity>().Create();
entity.RoleID = 1;
context.Set<UserRoleEntity>().Add(entity);
Assert.IsNotNull(entity.Role);
}
此测试失败: -
[TestMethod]
public void TestLazyLoadNewEntity2()
{
MyContext context = new MyContext();
UserRoleEntity entity = context.Set<UserRoleEntity>().Create();
context.Set<UserRoleEntity>().Add(entity);
entity.RoleID = 1;
Assert.IsNotNull(entity.Role);
}
在这两种情况下,它肯定都是创建代理实体,例如类型。
实体类型是 {System.Data.Entity.DynamicProxies.UserRoleRelationEnti_02312836F5B832353B301D531F352923C7A344A83045D8155F462D8BE23A5A53}
添加实体的顺序与分配的ID的差异会影响导航属性的延迟加载。在这两种情况下,我都可以在SQL事件探查器中看到执行加载角色的查询,但在第二种情况下,它无法导致加载导航属性。
这是预期的行为吗?我很确定以前的EF版本没有这样的行为。
编辑:按照建议pawel添加对DetectChanges的调用会使测试通过。因此,它看起来更像是预期的行为而不是错误。这对我来说是不幸的,因为我有一个代码库,曾经使用EDMX生成的实体,不需要这样的调用。我希望有另一种解决方案,因为我在一个很难找到的大代码库中破坏了代码
[TestMethod]
public void TestLazyLoadNewEntity2()
{
MyContext context = new MyContext();
UserRoleEntity entity = context.Set<UserRoleEntity>().Create();
context.Set<UserRoleEntity>().Add(entity);
entity.RoleID = 1;
context.ChangeTracker.DetectChanges();
Assert.IsNotNull(entity.Role);
}