通过外键在模拟的EF6数据库中加载相关数据

Ber*_*ian 5 c# database unit-testing entity-framework mocking

最近,我启动了一个用于模拟各种神经网络应用程序的项目。为了处理涉及的大量数据,我已经使用实体框架模型优先方法实现了SQL-Server后端。
另外,我对测试驱动开发(TDD)学科也非常喜欢。但是,为了做到这一点,我需要一个模拟数据库来运行我的测试。经过大量搜索,我发现了商业和开源的多种解决方案。在这一点上,值得注意的是,我是数据库相关主题的新手。因此我选择使用MSDN在内存中模拟描述了EF6框架描述这里

Pff,现在我们有了背景知识,这是我的问题:

我已经创建了模型并从中生成了数据库。实际接口层的代码生成由edmx完成。为了进行单元测试,我遵循了上述教程,并修改了相关字段以匹配我的数据库模型。(可在http://i.imgur.com/julse1Y.png?1中找到它,很遗憾,我没有代表在帖子中包含该图片...)。
但是,我不需要每个测试仅包含一些子集的所有数据。我想要一种情况,我可以在测试的设置中指定要加载哪些表,或者加载依赖项的深度。

我遇到的问题是,在指定相关外键时,相关数据未与当前DBSet一起加载。例如,当为连接集设置数据时,我希望条目链接到相关数据,在这种情况下,是节点集的元素:

var context = new TestContext();

context.NodeSet.Add(new Node { NodeID = 1 });
context.NodeSet.Add(new Node { NodeID = 2 });

context.ConnectionSet.Add(new Connection { ConnID = 1, ToNodeID = 1, FromNodeID = 2 });

var conn = context.ConnectionSet.First();
var fromNode = conn.FromNode;
var toNode = conn.ToNode;
Run Code Online (Sandbox Code Playgroud)

在此示例中,指定的Connection的FromNode属性返回null。理想的情况是该模拟具有将ToNodeID密钥与相关对象相关联的能力。此外,我希望加载顺序与解决iaw的关键约束有关,以便解析相应节点必须存在的FromNode字段。

我乐于接受有关此特定问题的所有建议,但也欢迎你们中的任何人知道模拟EF6模型优先数据库设计的更富建设性的方法。

提前致谢!

Wik*_*hla 1

经过讨论和重新思考这个问题后,我相信最简单的方法是忘记自动解决,ID而是在测试之前手动设置引用。

换句话说,如果您有两个 dbset,Child并且Parent每个子实体都指向一个父实体,那么您就有

public class Child
{
   public int ID_PARENT { get; set; }
   public virtual Parent Parent { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后你用数据设置你的模拟

var mockedContext = ... ; // create mocked context with mocked DbSets as
                          // shown in the article you refer to

Child c = new Child();

Parent p = new Parent();
c.Parent = p;  // set up the relation manually

mockedContext.Child.Add( c );
mockedContext.Parent.Add( p );

// property resolving works now as you have set it up in an explicit way
// note that IDs are irrelevant
var children = mockedContext.Child.Where( c => c.Parent != null && c.Parent.Name.StartsWith( "n" ) );
Run Code Online (Sandbox Code Playgroud)