1

这个问题不是关于如何测试数据访问,也不是关于存储库。这是关于我想在项目中使用我的 POCO 类(我用 TDD 制作的)时遇到的问题。我的意思是,这是由于 Linq to Entities 限制的问题(或者可能是我关于类设计的问题)。

我通过 TDD 学习的课程是下一个(当然,非常简化):

public class Person{
    public int IdPerson{ get; set; }
    public string Name { get; set; } 
    public int Average { get; set; }
}

public class Course{
    public int IdCourse { get; set;}
    public Person Professor { get; set;}
    public IEnumerable<Person> Staff { get; set;}
    public IEnumerable<Person> Students { get; set;}

    public IEnumerable<Person> GetGreatStudents(){
        return Students.Where(n => n.Average > 8);
    }
}

很简单,对吧?

那么……那有什么问题呢?让我们看看......当我想从数据库中检索课程中的所有数据(课程类在现实模型中有很多子集合)对它们应用过滤器时,我能做到的唯一方法是这样的:

var course = from obj in Courses //Doesn't matter how i get the courses' collection
             select {
                 IdCourse = obj.IdCourse,
                 GreatStudents = obj.GetGreatStudents(), // Here is the problem
                 OtherCollection = obj.OtherCollection.Where(n => n.Active).Select(n => n.Property1)
             }

如您所知,由于GetGreatStudents()函数,它会返回错误:

LINQ to Entities 无法识别方法 [...] 此方法无法转换为存储表达式。

我的意思是,我知道我可以直接用.Where(n => n.Average > 8)替换该方法,但它很糟糕(实际上有很多过滤器),这样,有什么意义如果我不能使用我已经构建和测试过的 api,使用 TDD?

所以,我的问题是,对于那些有 TDD 和实体框架开发经验的人,当你使用 Linq to Entities 时,如何才能使用你通过 TDD 设计的漂亮 API?

4

1 回答 1

1

首先,我同意这是一个 TDD 问题(因为您在使用 TDD 时遇到了它!)

您遇到的问题是您无法实现持久性无知;您的实体与 SQL 相关联(因此我认为严格来说它们不是 POCO,因为它们与特定框架相关联)

我发现这个问题的唯一解决方案是将域模型对象与持久性模型对象(即 EF 对象)分开,并编写一个能够从我的域对象映射到我的持久性对象的库。这是很多工作,我会质疑对于小型项目是否值得。如果你把实用主义放在纯粹主义之前,那么简单地理解你不能在 EF 中做这些事情要容易得多(但不太令人满意),即使你可以为它们编写单元测试。

我发现这个这个很有帮助,虽然有点片面。

您的问题是一篇旧帖子,所以如果您找到了更好的方法,我很乐意听到它。

于 2016-11-11T13:56:46.760 回答