使用导航属性元数据过滤实体集合

时间:2012-02-23 20:28:53

标签: entity-framework entity-framework-4 edmx

我在EF4 / .NET 4中使用.tt模板从我的模型和存储库生成自我跟踪实体以访问它们。在单元测试期间,我希望能够将“真正的”ObjectContext与基本的实体集合交换出来。我有一个内部方法,用测试数据预先加载这些存储库。

这工作正常,直到我需要访问这些实体的导航属性。我不想手动编写所有这些子集合的代码。相反,我想编写一系列Departments和Employees集合的代码:

public class Department
{
    public int DepartmentId { get; set; }
    public string DepartmentName { get; set; }
    public List<Employee> Employees { get; set; }
}

public class Employee
{
    public int EmployeeId { get; set; }
    public int DepartmentId { get; set; }
    public string Name { get; set; }
}

var departments = new[]
{
    new Department { DepartmentId = 1, DepartmentName = "Purchasing" },
    new Department { DepartmentId = 2, DepartmentName = "Sales" },
};

var employees = new[]
{
    new Employee { DepartmentId = 1, EmployeeId = 1, Name = "Jan Smith" },
    new Employee { DepartmentId = 1, EmployeeId = 2, Name = "Bob Jones" },
    new Employee { DepartmentId = 2, EmployeeId = 3, Name = "Lisa Johnson" },
    new Employee { DepartmentId = 2, EmployeeId = 4, Name = "Bill Porter" },
};

所以不知何故,鉴于这两个集合和我的EDM,我需要在我的“模拟上下文”中编写功能:

  • 通知我有一个实体“部门”,收集了“员工”(这是一个由协会支持的导航财产)
  • 注意到这些是通过DepartmentId
  • 相关的
  • 当我加载我的部门测试数据时,对于每个部门实体,它会加载具有匹配的DepartmentId的员工集合

因此,最终结果是我的“采购”部门实体的员工集合加载了Jan Smith和Bob Jones。但基本上它应该只通过检查EDM来做到这一点,所以我不需要对这些关联进行两次编码。

随着我的模型扩展,我可以简单地创建平面测试数据的编码集合,但是当它们被加载到我的模拟存储库中时,它会计算出所有匹配的集合以及它们也具有匹配测试数据的类型。

所以基本上我正在寻找模拟.Include() - 像EF那样的模拟数据用于“真实”数据。我的问题是,有什么事情已经做到了吗?或者自己编码是否相对简单?我无法找到文档&amp;很多这方面的例子和提供的.tt模板(我希望用于指导/示例)非常复杂。

0 个答案:

没有答案