MySQL 5.7:添加或更新EDMX模型时的System.Data.StrongTypingException

时间:2015-11-07 13:14:10

标签: mysql entity-framework entity-framework-6 mysql-5.7

我尝试让实体框架(5或6)使用MySQL 5.7(数据库优先),但为(测试)数据库添加实体数据模型会导致错误"生成时出现意外异常模型。 StrongTypingException:列' IsPrimaryKey'的值在表TableDetails中是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.6 EF 5 有效。我可以添加,更新和使用EDMX模型。
  • MySQL 5.6 EF 6 部分工作。添加EDMX模型时,向导崩溃。我可以为EF 5添加一个模型,将EF更新为6,安装Nuget包' MySql.Data.Entity'并将EDMX模型更新为EF 6.该模型在运行应用程序时有效。但是尝试从数据库更新模型会导致异常。
  • 创建如上所述的 EF 6 模型并在具有 MySQL 5.7 的计算机上使用该模型后,模型可以正常工作,但更新(再次)会导致StrongTypingException。

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

3 个答案:

答案 0 :(得分:4)

更新第3次:执行以下查询:您需要将全局和非全局开关关闭。我已经证明这些适用于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

答案 1 :(得分:0)

不是问题的确切答案,但似乎有效的解决办法。

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

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

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

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

在对几个实体执行上述操作之后,我注意到当我运行我的测试来查询数据并运行调试时...异常被抛出然后被MySQL代码捕获而与缺少的__migrations有关。我不确定如何解决这个问题,但我也不希望EF进行自动迁移。因此,在Web上的其他一些帮助之后,我将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>

我不太确定我做的所有事情都是“最好的方式”,但是我摆脱了例外。

答案 2 :(得分:-3)

MySql不支持MS-SQL上的EF-5支持