MySQL - 实体:表'TableDetails'中'IsPrimaryKey'列的值是DBNull

时间:2015-11-06 20:21:20

标签: c# mysql entity-framework

我将 Visual Studio 2013 实体框架5 和M ySQL Server 5.7.9 一起使用。

尝试从数据库创建模型时(或'从数据库更新模型'),将显示以下消息:

  

'System.Data.StrongTypingException:列的值   表'TableDetails'中的'IsPrimaryKey'是DBNull。 ---> System.InvalidCastException:指定的强制转换无效。

我知道之前已经问过这个问题,但我找不到任何解决方案。 此外,我没有选择降级到MySQL 5.6。

即使对于简单的表格,也会出现问题。

样本表

CREATE TABLE new_table
(
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(45) NOT NULL,
  PRIMARY KEY (id)
) 
ENGINE = InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

如果表仅包含主键,则表明正在创建模型。

修改 如果我创建两个字段PRIMARY Keys,则创建模型时没有任何错误。

有没有人对此有任何想法?

亲切的问候。

完整的错误堆栈:

  

由于以下异常,无法生成模型:   'System.Data.StrongTypingException:列的值   表'TableDetails'中的'IsPrimaryKey'是DBNull。 --->   System.InvalidCastException:指定的强制转换无效。在   Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.SchemaDiscovery.TableDetailsRow.get_IsPrimaryKey()   ---内部异常堆栈跟踪结束---在Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.SchemaDiscovery.TableDetailsRow.get_IsPrimaryKey()   在   Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.StoreModelBuilder.CreateProperties(IList 1 columns, IList 1个错误,列出1& keyColumns, List 1& excludedColumns,   列表1& invalidKeyTypeColumns) at Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.StoreModelBuilder.CreateEntityType(IList 1   列,布尔& needsDefiningQuery)at   Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.StoreModelBuilder.CreateEntitySets(IEnumerable的1 tableDetailsRows, EntityRegister entityRegister, IList 1   entitySetsForReadOnlyEntityTypes,DbObjectType objectType)at   Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.StoreModelBuilder.CreateEntitySets(IEnumerable 1 tableDetailsRowsForTables, IEnumerable 1 tableDetailsRowsForViews,   EntityRegister entityRegister)at   Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.StoreModelBuilder.Build(StoreSchemaDetails   storeSchemaDetails)at   Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelGenerator.CreateStoreModel()   在   Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelGenerator.GenerateModel(列出1 errors) at Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelBuilderEngine.GenerateModels(String storeModelNamespace, List 1个错误)at at   Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelBuilderEngine.GenerateModel(EdmxHelper   edmxHelper)”。从数据库加载元数据   00:00:00.5856317

11 个答案:

答案 0 :(得分:167)

实体框架(版本6.1.3)和MySQL服务器(> = 5.7.6)

解决问题的一种方法是,

scala> @tailrec def f(i: Int): Boolean = false & f(i)
<console>:16: error: could not optimize @tailrec annotated method f: it contains a recursive call not in tail position

这是一个迟到的回复。但希望它会对某人有所帮助。

感谢。

答案 1 :(得分:23)

这是一个知道错误:http://bugs.mysql.com/bug.php?id=79163

在mysql控制台上运行命令:

  

设置global optimizer_switch ='derived_merge = off'

OR

  

设置@@ optimizer_switch ='derived_merge = OFF'

(这个对我有用)

使用此命令验证更改是否有效:

  

SELECT @@ optimizer_switch \ G

https://dev.mysql.com/doc/refman/5.7/en/switchable-optimizations.html

答案 2 :(得分:10)

上面的每个答案都可以正常工作,但是当重新启动服务器或开发机器时,我们需要一次又一次地执行所有步骤。 要完全解决,我们可以在mysql配置中将此属性命名为“derived_merge = OFF”。 好的,要做到这一点,你需要使用de MySQL Workbench访问你的MySQL服务器,并打开“选项文件”&gt;选择性能选项卡。在Optimizer组中,查找optimizer_switch,单击复选框以启用字段,并将'derived_merge = OFF'。 在services.msc和voilá中重新启动服务器!

答案 3 :(得分:6)

以下sql为我工作:

KTable

我的MySQL版本是5.7.15,我使用&#34; EF Designer来自数据库&#34; Visual Studio 2015中的选项。

我希望它能帮助别人:)

答案 4 :(得分:5)

解决方法 SET GLOBAL optimizer_switch ='derived_merge = off';

答案 5 :(得分:3)

表'TableDetails'中'IsPrimaryKey'列的值是DBNull

当您尝试在Entity Framework中使用MySql时会发生这种情况。

我已经解决了这个问题:

打开MySQL 5.7命令行客户端,输入密码,按enter键,然后键入:

set global optimizer_switch='derived_merge=off';
set optimizer_switch='derived_merge=off';

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

重新启动Visual Studio你很高兴,我已经尝试过使用VS 2013和VS 2017,并在两者中工作过!

答案 6 :(得分:2)

运行此脚本,使用MySql.Data.Entity块包

时,它对我来说非常有效
use YourDB;
   set global optimizer_switch='derived_merge=OFF';

答案 7 :(得分:1)

我们遇到了同样的错误。 但是,我认为这是MySQL的服务器问题。

状态:

  • EF5
  • MySQL VS Tools 1.2.5
  • VS社区2015
  • C#
  • 来自数据库创建EF Designer(我使用的是日文版,因此菜单名称是我的英文...)

结果:

  • MySQL 5.7.9 =&gt;错误。
  • MySQL 5.6.26 =&gt;没错。

答案 8 :(得分:1)

就我而言:

使用的模块:

实体框架6 MySql数据连接器6.9.9 MySQL VS Tools 1.2.6 适用于VS2015的EF6工具

我必须这样做=&gt; SET GLOBAL optimizer_switch =&#39; derived_merge = off&#39 ;; 但是如果使用&#34; root&#34;用户错误继续。使用&#34; common&#34;进行登录时用户,它创建模型OK。

答案 9 :(得分:0)

从今天开始,这是经过验证的 MySql社区服务器5.7.9 错误ID 79163

作为解决方法,我重新设计了应用程序以使用代码优先练习

  

ADO.NET实体数据对象 - &gt;清空代码优先模型

并手动添加所有对象及其属性。

使用的模块:

  • 实体框架6
  • MySql Data Connector 6.8.9
  • MySQL VS Tools 1.2.5
  • VS2013的EF6工具

答案 10 :(得分:0)

我找到了解决此类错误的好方法。

<强> 1。解决方案(数据库优先) 不要尝试更新.edmx文件中的现有模型,而是右键单击edmx中的某个实体,然后选择 - &gt;转到modelbrowser(项目地图浏览器中会出现一个新的寄存器)。 现在选择要更新的实体,右键单击并执行更新。在我的情况下,它每次都工作,而无需在mysql中切换任何东西。但是,您可能会被迫手动更改某些关系。 如果在这里出现任何问题(在我的情况下,非fk / pk密钥没有问题。如果你删除了一个fk并试图自己订购所有关系,你的数据库可能会被丢弃。但是如果你只是更新不是主要/那么这种情况永远不会发生外键属性或只是添加一个新表。

编辑: 此解决方案非常适合删除,更新和添加新关系。在fk / pk属性上执行更新时会导致问题!

如果您的表已被删除,那么只需创建一个具有相同首选项的新表。

<强> 2。解决方案(数据库优先,必须更新pk / fk密钥时) 删除表并创建一个新表。一共花了3分钟

我希望我能帮一点点,这个错误让我在过去的两周内疯狂了!

P.S。在我被覆盖之前,我从未经历过这种类型的错误! mysql中现有关系中的外键。然后我尝试更新与实体框架(数据库优先)的关系,从那时起就出现了dbNullBug。我能够通过添加和删除现有属性来手动管理我的实体,但这真的很累。解决方案1对我来说效果很好,如果我需要更新外键,我只需删除现有模型并创建一个新模型。