C# - EF 6 - MySQL:从单元测试方法调用方法时出错

时间:2015-02-26 08:29:46

标签: c# mysql entity-framework unit-testing entity-framework-6

我有一个包含多个项目的解决方案。到目前为止,一切都运行得很好,甚至从引用的项目中调用方法。

现在我尝试开始使用单元测试,因此我可以测试不同的方法,而不会遇到GUI的全部开销等等。

我有一个Form1,它创建一个实体模型的实例。此模型是从MySQL数据库创建的。当我启动Form-Project时,从Form1进行实例化没有问题。但是当我在单元测试项目中引用所有内容时,只是实例Form1,EF似乎有问题。我得到的是我的实体模型的实例,其中包含以下内容:

*编辑:我得到的错误是: 您的SQL语法有错误;查看与MySQL服务器版本对应的手册,以便在' FROM附近使用正确的语法((SELECT 情况何时(Extent2ID为空)然后(空)ELSE(1)结束AS'在第188行

我设法看到有些列表被填满,有些则没有。但是我真正不理解的是,为什么当从project1调用时,整个工作正常,并且从另一个项目调用,引用project1时,会导致该错误。

例如:table1.toList()起作用,table2.toList()给出上述错误。但是只有从project2调用时才会。

* edit2:我设法把它钉了下来

导致错误的行是:

technikerListe = entities.mitarbeiter.
            Where(m => MitarbeiterIdListe.Contains(m.ID) && m.aktiv == "Y")....

(其中entity是我的模型实例)

但是当我得到mitarbeiter表中的条目列表时,就像这样

List<mitarbeiter> mitarbeiterList = entities.mitarbeiter.ToList();

然后尝试使用

来获得上述内容
technikerListe = mitarbeiterList.
            Where(m => MitarbeiterIdListe.Contains(m.ID) && m.aktiv == "Y")....

它有效。

毕竟,这似乎是一个懒惰的加载问题?

1 个答案:

答案 0 :(得分:0)

你看到的基本上是一个功能,而不是一个bug。它被称为Lazy-loading。如果您不提问,EF也不会从数据库中加载任何数据。请考虑以下示例:

using(var ctx = MyCoolContext("ConnectionString")) 
{
    var query = ctx.Bugs;
    var result = query.ToList(); // <= fetching the data is done here!
}

实际行为是EF只会在您枚举结果时对服务器运行查询(使用上面的.ToList()完成)。

因此,您在上面发布的语句基本上只是当您最终告诉它时,EF将发送给MySQL的查询。

编辑:


阅读你的错误我想你正试图实现多个N到M的关系(可能是.Include()?),这与最新的MySQL连接器一起使用时会导致最新的EF 6.1.2版本出现问题。您是否有可能在两个项目中使用不同版本的EF?你能尝试降级到EF 6.1.1吗?

请再次提供更多信息,哪些查询失败?