C# 如何执行集成测试以测试急切加载的实体(EF4代码优先)

C# 如何执行集成测试以测试急切加载的实体(EF4代码优先),c#,entity-framework-4,integration-testing,code-first,eager-loading,C#,Entity Framework 4,Integration Testing,Code First,Eager Loading,下面是一个简单的场景来解释我要做的事情。假设我正在创建一个博客引擎,我有两个实体,Post和Comment,两者之间有一对多的关系。在我的服务层中,我有一个查询逻辑来检索关于帖子的详细信息,如下所示: Post post = new PostByIdQuery(_unitOfWork).WithPostId(5).Execute(); 这行代码将执行一个查询,该查询将从id值为5的数据库中检索post实体。此查询对象已编码,并通过使用真实数据库的集成测试 如果我正在编辑一篇文章或在显示一篇带有

下面是一个简单的场景来解释我要做的事情。假设我正在创建一个博客引擎,我有两个实体,
Post
Comment
,两者之间有一对多的关系。在我的服务层中,我有一个查询逻辑来检索关于帖子的详细信息,如下所示:

Post post = new PostByIdQuery(_unitOfWork).WithPostId(5).Execute();
这行代码将执行一个查询,该查询将从id值为5的数据库中检索post实体。此查询对象已编码,并通过使用真实数据库的集成测试

如果我正在编辑一篇文章或在显示一篇带有评论的文章时,我可能希望通过两个业务流程获得一篇指定ID的文章。此查询对象在这两种情况下都可以正常工作,但在显示带有注释的帖子时会影响性能,因为默认情况下注释列表是延迟加载的。因此,在对帖子的注释进行迭代时,将导致多个数据库命中

当然,如果我总是迫不及待地加载帖子的评论,如果我只是编辑帖子,就会导致不必要的表连接

因此,我想向fluent接口添加一个新方法,该方法将指定注释是否应该延迟加载。问题是,我如何编写一个集成测试来检查注释表是否已快速加载,以便在运行单元/集成测试时可以检查这个新需求

据我所知,
Post.Comments
属性在访问时将显示相同的内容,无论是即时加载还是延迟加载,因此我不确定如何为此创建测试



编辑:仅供参考,这是使用EF4的代码优先机制,因此我的实体是POCO。

您可以将集合对象强制转换为更高级的EntityCollection类型,然后检查其中的IsLoaded属性

Assert.IsTrue(((EntityCollection<Comment>)Post.Comments).IsLoaded);
Assert.IsTrue(((EntityCollection)Post.Comments.isload);
如果这不起作用,请看一下Rowan对我刚才问的这个问题的回答。出于另一个原因,我试图让我的code first集合作为EntityCollection公开


Ohhhh-先编码-抱歉,这使问题变得更难。是的,我最初没有明确说明:)强制转换失败,出现了一个InvalidCastException“无法强制转换System.Collections.Generic.List[Comment]以键入System.Data.Objects.DataClasses.EntityCollection[Comment]“您是否将您的收藏声明为列表?如果是这样的话,我很确定EF Code First提供了一些接口类型。如果它们被声明为实体列表,那么我很确定绝对没有办法满足您的要求。不,我所有的收藏都是
公共虚拟ICollection
实体。EF必须将它们转换为列表。与上述链接的答案有效吗?如果不是,我建议创建一个新问题,专门询问如何将EF4 Code First集合转换为EntityCollection,以生成IsLoaded属性。不,尝试将其转换为EntityCollection的两种方法都失败。我试着提出另一个问题