最近我开始了一个模拟各种神经网络应用的项目。为了处理大量涉及的数据,我使用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模型的第一个数据库设计。
提前致谢!
答案 0 :(得分:1)
在讨论并重新思考问题之后,我认为最简单的方法是忘记ID
自动解析,而是在测试之前手动设置引用。
换句话说,如果您有两个dbset,Child
和Parent
并且每个子实体都指向一个父级,那么您就拥有了
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" ) );