我将 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(IEnumerable1 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
答案 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的服务器问题。
答案 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;清空代码优先模型)
并手动添加所有对象及其属性。
使用的模块:
答案 10 :(得分:0)
我找到了解决此类错误的好方法。
<强> 1。解决方案(数据库优先)
不要尝试更新.edmx文件中的现有模型,而是右键单击edmx中的某个实体,然后选择 - &gt;转到modelbrowser(项目地图浏览器中会出现一个新的寄存器)。
现在选择要更新的实体,右键单击并执行更新。在我的情况下,它每次都工作,而无需在mysql中切换任何东西。但是,您可能会被迫手动更改某些关系。
如果在这里出现任何问题(在我的情况下,非fk / pk密钥没有问题。如果你删除了一个fk并试图自己订购所有关系,你的数据库可能会被丢弃。但是如果你只是更新不是主要/那么这种情况永远不会发生外键属性或只是添加一个新表。
编辑: 此解决方案非常适合删除,更新和添加新关系。在fk / pk属性上执行更新时会导致问题!
如果您的表已被删除,那么只需创建一个具有相同首选项的新表。
<强> 2。解决方案(数据库优先,必须更新pk / fk密钥时) 删除表并创建一个新表。一共花了3分钟
我希望我能帮一点点,这个错误让我在过去的两周内疯狂了!
P.S。在我被覆盖之前,我从未经历过这种类型的错误! mysql中现有关系中的外键。然后我尝试更新与实体框架(数据库优先)的关系,从那时起就出现了dbNullBug。我能够通过添加和删除现有属性来手动管理我的实体,但这真的很累。解决方案1对我来说效果很好,如果我需要更新外键,我只需删除现有模型并创建一个新模型。