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

时间:2014-02-05 22:20:41

标签: c# database entity-framework unit-testing mocking

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

Pff,现在我们得到了背景,这是我的问题:

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

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

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;

在此示例中,指定Connection的FromNode属性返回null。期望的情况是模拟具有将ToNodeID键与相关对象相关联的能力。此外,我希望加载顺序与解决关键约束i.a.w相关。为了解析FromNode字段,必须存在相应的Node。

我对所有关于这个具体问题的建议持开放态度,但是如果你们中的任何人知道更具建设性的方式来模拟EF6模型的第一个数据库设计。

提前致谢!

1 个答案:

答案 0 :(得分:1)

在讨论并重新思考问题之后,我认为最简单的方法是忘记ID自动解析,而是在测试之前手动设置引用。

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

public class Child
{
   public int ID_PARENT { get; set; }
   public virtual Parent Parent { get; set; }
}

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

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" ) );