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

C# - EF 6 - MySQL: Error when calling method from unit test method

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

现在我尝试开始使用单元测试,这样我就可以测试不同的方法,而无需 运行 GUI 等的全部开销。

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

*编辑:我得到的错误是: 您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在 'FROM ((SELECT 附近使用的正确语法 CASE WHEN (Extent2.ID IS NULL) THEN (NULL) ELSE (1) END AS ' at line 188

我设法看到有些列表已填满,有些则没有。但是我真的不明白的是,为什么当从 project1 调用时,整个事情都有效,而从另一个项目调用,引用 project1,它会导致那个错误。

例如:table1.toList() 有效,而 table2.toList() 给出上述错误。但仅当从 project2 调用时。

*edit2:我设法确定了它

导致错误的行是:

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

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

但是当我像这样在 mitarbeiter table 中获得条目列表时

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

结束然后尝试使用

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

有效。

毕竟,这似乎是一个延迟加载问题?

你看到的基本上是一个功能,而不是一个错误。它被称为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() ?),这会导致最新的 EF 6.1.2 版本在与最新的 MySQL 连接器。您是否有可能在两个项目中使用不同版本的 EF?您可以尝试降级到 EF 6.1.1 吗?

再次请提供更多信息,什么查询失败了?