加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 22:01:15 所属栏目:百科 来源:网络整理
导读:最近我开始了一个模拟各种神经网络应用的项目.为了处理大量涉及的数据,我使用Entity Framework Model第一种方法实现了SQL-Server后端.此外,我已经非常喜欢测试驱动开发(TDD)学科.但是为了做到这一点,我需要一个模拟数据库来运行我的测试.经过多次搜索,我找到
最近我开始了一个模拟各种神经网络应用的项目.为了处理大量涉及的数据,我使用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模型的第一个数据库设计.

提前致谢!

解决方法

在讨论并重新思考问题之后,我认为最简单的方法是忘记按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" ) );

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读