我们在单元测试中有一个场景,我们创建了一个实现IDbSet的FakeDbSet。 在FakeUnitOfwork中,我有一些IDbSets属性,并使用FakeDbSet进行了新的编辑。

无需在我的Commit方法中写出每个不同的属性,我试图使用反射来迭代FakeUnitOfWork中的属性。 然后,我想将属性值复制到具有相同类型的List <>属性的不同类中。 所以我的FakeUnitOfWork中可能有一个属性:

IDbSet<User> Users {get {return _users ?? (_users = new FakeDbSet<User>());}

在我的假数据存储中,我有这个属性:

List<User> Users {get;set;}

这是我到目前为止的情况:

public void Commit()
{ 
     foreach (var property in typeof(TestUnitOfWork).GetProperties())
            {
               var testContextType = typeof (TestDataContext).GetProperty(property.Name);
//I then want to do a ToList() on the TestUnitOfWork IDbSet properties to push them into the TestDataContext.


            }
}

所以,我不知道如何知道我正在查看IDbSet(来自FakeUnitOfWork)和List(来自我的伪内存数据存储),以便我可以将数据从FakeUnitOfWork复制到数据存储。 由于它们具有相同的名称,我只需要弄清楚如何通过反射进行铸造。

更新:我试过这样的事情,并认为我可能会在正确的轨道上,但代码永远不会被击中:

foreach (var property in typeof(TestUnitOfWork).GetProperties())
                {
                   var testContextType = typeof (TestDataContext).GetProperty(property.Name);
                   if(property.GetValue(this,null) is IDbSet<MyBaseEntityType>)
                   {
                        testContextType.SetValue(TestDataContext, ((IDbSet<MyBaseEntityType>) property.GetValue(this,null)).ToList(),null);
                   }


                }

===============>>#1 票数:2 已采纳

您使用反射来获取上下文和工作单元的类型和属性。 现在,您在一侧具有List<>类型的属性,并且您希望为其分配类型为IDbSet<>的属性的内容。 这样对吗?

理论

为此,您需要在IDbSet<>上调用ToList方法,但此方法不是IDbSet<>接口的一部分。 它是System.Linq.Enumerable静态类中定义的扩展方法。 扩展方法只是具有语法糖的静态方法,但它仍然可以称为常规静态方法。 因此,您必须使用反射(get type)查找Enumerable类,获取ToList方法的通用方法信息,并将其定位到正确的泛型参数(由当前IDbSet<> )。 然后,您可以将set作为参数传递给此方法并调用它。

无论如何,更好的方法是避免尽可能多的反思。 例如,在TestUnitOfWorkTestUnitOfWork可以直接访问列表的特殊接口。

  ask by DDiVita translate from so

未解决问题?本站智能推荐:

1回复

创建递归方法以遍历实体类及其集合

我在应用程序中使用的是EF Code-First方法,并且我有很多包含ICollection对象的实体类。 我的目标是以递归方式遍历实体及其集合,以构建一棵树(使用json和jsTree)。 我以为我需要在这里反思... 今天,为了满足我的需要,我使用了很少的内部foreach循环
1回复

如何反思EntityFramework类(模型优先方法)?

使用DataBase First时,可以创建为VisualStudio生成的类的实例。 我的意思是,对于MVC3工具更新,我使用t4模板和使用T4模板的命令“ Generate Code”来从数据库创建具有多对多关系的类。 我可以使用反射在一个独立的程序集(dll)中“填充”实例的属
1回复

C#,MVC-通过考虑其他模型的属性上的属性来构建模型(在运行时)并保存在数据库中

我希望给如下所述的Person提供从我的系统中打印vCard的功能。 为了向用户提供隐私选项,用户可以选择是否显示/隐藏某些属性。 以最简单的形式,我需要有一个单独的表来保存用户的选择。 我想知道是否有可能使用反射来构建此configurator table 。 如下面的Person
1回复

将一个属性提取为List 来自ICollection的模型

我试图从ICollection中选择一个属性[filename]到一个List中,其中dr405有很多属性。 return GetDR405ById(c, id).dr405files.Select(p => p.FileName).ToList<String>();
1回复

EF Code First约定允许ICollection 属性是空集合而不是null?

我注意到,默认情况下,除非集合中至少有一项,否则Entity Framework Code First忽略实例化ICollection<T>属性。 我更希望保证集合始终是空的HashSet (即,具有零个项目的HashSet ),而不是如果没有项目则为null 。 EF Co
1回复

如何将同一类的两个不同属性添加到一个POCO类中?

我有一个类,对一个类(用户)有两个引用: 问题是EF仅创建对第一个键(用户名)的引用。 这样,User和User2将用户名作为键,而不是我想要的... 我发现这是答案: nHibernate,将两个属性映射到同一类 但是我不知道如何将此应用于我的方案。 谢谢。
2回复

EF4.1在另一个C#项目中使用T4

我最近一直在学习MVVM / EF4(适用于C#),并一直关注Julie Lerman的视频。 在她的视频中,她展示了如何在一个项目中创建EDMX,然后通过将第一个作为第二个的引用来在另一个项目中使用它。 我现在遇到了EF4.1,想知道是否有可能在一个项目中创建EDMX和T4项目(* .
3回复

实体框架代码优先 - 为什么我不能这样更新复杂属性?

我正在使用Entity Framework 4.1(代码优先)开展一个小型示例项目。 我的课程看起来像这样: 我已经将几个EmployeeTypes(“first”,“second”)保存到数据库中,并且我保存了第一个类型的Person。 现在我要修改Person。 我知道我可以通
1回复

包装DbSet 使用自定义DbSet / IDbSet?

首先,我认为这样做有些荒谬,但是我团队的其他成员坚持认为,除了“我认为这是愚蠢的”之外,我无法提出反对它的好论据...... 我们要做的是创建一个完全抽象的数据层,然后具有该数据层的各种实现。 很简单吧? 输入实体框架4.1 ... 我们的最终目标是程序员(我尽力只留在数据层)永
2回复

IDbSet.Add和DbEntityEntry.State = EntityState.Added有什么区别?

在EF 4.1+中,这两行代码之间有区别吗? 或者他们做同样的事情? 我想知道是否可能会影响子集合/导航属性与另一个不同。