2

我尝试让实体框架(5 或 6)与 MySQL 5.7(数据库优先)一起使用,但为(测试)数据库添加实体数据模型会导致错误“生成模型时发生意外异常。StrongTypingException:值对于表 TableDetails 中的列 'IsPrimaryKey' 是 DBNull。”。顺便说一下,该表有一个主键:

CREATE TABLE `test` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Value` int(11) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

在我试图找到这个问题的根源时,我尝试了一些组合:

  • MySQL 5.6EF 5一起工作。我可以添加、更新和使用 EDMX 模型。
  • 带有EF 6的MySQL 5.6可以部分工作。添加 EDMX 模型时,向导会崩溃。我可以为 EF 5 添加一个模型,将 EF 更新为 6,安装 Nuget 包“MySql.Data.Entity”并将 EDMX 模型更新为 EF 6。该模型在运行应用程序时工作。但是尝试从数据库更新模型会导致异常。
  • 在像上面那样创建EF 6模型并在装有MySQL 5.7的机器上使用它之后,该模型可以工作,但更新(再次)会导致 StrongTypingException。

我希望这个问题可以通过一些 MySQL 配置以某种方式解决。我已经show_compatibility_56=ON在使用 MySQL 5.7 的机器上进行了尝试。没有帮助。

4

3 回答 3

4

第三次更新:执行以下查询:您需要关闭全局和非全局开关。我已经证明这些适用于 VS2015 + EF6.1.3 + MySql 5.7.12

use <<database name>>;
set global optimizer_switch='derived_merge=off';
set optimizer_switch='derived_merge=off';

设置这些值后,您需要在尝试创建 EDMX 之前重新启动 Visual Studio。

如果您没有看到结果,请检查两个变量是否通过以下方式正确设置:

select @@optimizer_switch;
select @@GLOBAL.optimizer_switch;

两个查询都应该在变量值字符串的末尾找到“derived_merge=off”的结果。

注意:如果您重新启动服务器,则需要再次设置这些值,因为 derived_merge optimizer_switch 默认为 ON。

参考:关于 EF6.1.3 和 MySql 5.7 的这个 BUG 已经有积极的讨论 https://bugs.mysql.com/bug.php?id=79163

于 2016-05-02T05:47:13.680 回答
0

不是对问题的确切答案,而是一种似乎有效的解决方法。

我在尝试使 ADO.NET 映射工作时遇到了类似的问题。但是,我能够手动创建我的 POCO 实体并手动创建DbSet<>代码,这使我能够成功地查询我的数据库。这是一个快速的设置方法,这真的很轻松。

http://lvasquez.github.io/2014/11/18/EntityFramework-MySql/

然后,我使用本指南来学习如何使用其他属性来进一步映射我的数据:

https://msdn.microsoft.com/en-us/data/jj591583.aspx#TableColumn

在对几个实体执行上述操作后,我注意到当我运行测试以查询数据并运行调试时......异常被抛出,然后被与丢失的 __migrations 相关的 MySQL 代码捕获。我不太确定如何解决这个问题,但我也不希望 EF 进行自动迁移。因此,根据网络上的其他一些帮助,我将 EF 配置为禁用自动迁移并且不进行数据库初始化:

为了关闭自动迁移,我将这个类与我的 DbContext 实现一起放入项目中:

internal sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }
}

然后,要禁用数据库初始化(这实际上是引发错误的原因,我将它放在我的 app.config 中(在<entityFramework>配置标签内):

<contexts>
  <context type="My.Model.MyDbContext, My.Model" disableDatabaseInitialization="true"/>
</contexts>

我不太确定我是否以“最好的方式”做了所有事情,但这消除了我的例外情况。

于 2016-02-04T17:21:38.450 回答
-3

MySql 不支持 EF-5 仅支持 MS SQL

于 2016-01-21T13:16:48.987 回答