当列不是 PK 时,EF6 MySQL StrongTypingException

Posted

技术标签:

【中文标题】当列不是 PK 时,EF6 MySQL StrongTypingException【英文标题】:EF6 MySQL StrongTypingException When Column is not PK 【发布时间】:2015-11-04 20:26:42 【问题描述】:

我们在 VS 2013 中使用 mysql 和 Entity FrameWork,这些是安装的工具:

MySql 服务器 5.7.8 MySql 工作台 6.3。 MySql for Visual Studio 1.2.4 连接器/NET 6.9。 VS 2013 终极版 通过 NuGet 安装的 Entity FrameWork 6.1.3

我们已将必要的库导入 MySQLWeb、MySQL.Data、Mysql.Data.Emtity.EF6 项目中

我们使用 MySQLWorkBench 创建了一个带有如下简单表的模式:

CREATE TABLE `persona` (
  `idpersona` int(11) NOT NULL,
  `nombre` int(11) DEFAULT NULL,
  PRIMARY KEY (`idpersona`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我们遇到的问题是,我们创建了 ADO.net 实体数据模型,我们直接连接到数据库,但它没有创建模型并显示以下错误:

'System.Data.StrongTypingException: El valor de la columna 'IsPrimaryKey' de la tabla 'TableDetails' es DBNull。 ---> System.InvalidCastException: La conversión especificada no es valida。 zh Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.SchemaDiscovery.TableDetailsRow.get_IsPrimaryKey() --- Fin del seguimiento de la pila de la excepción interna --- en Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.SchemaDiscovery.TableDetailsRow.get_IsPrimaryKey() zh Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.StoreModelBuilder.CreateProperties(IList1 columns, IList1 错误,List1& keyColumns, List1& 排除列, 名单1& invalidKeyTypeColumns) en Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.StoreModelBuilder.CreateEntityType(IList1 列、布尔值和需要定义查询) zh Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.StoreModelBuilder.CreateEntitySets(IEnumerable1 tableDetailsRows, EntityRegister entityRegister, IList1 entitySetsForReadOnlyEntityTypes, DbObjectType objectType) zh Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.StoreModelBuilder.CreateEntitySets(IEnumerable1 tableDetailsRowsForTables, IEnumerable1 tableDetailsRowsForViews, EntityRegister entityRegister) zh Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.StoreModelBuilder.Build(StoreSchemaDetails storeSchemaDetails) zh Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelGenerator.CreateStoreModel() zh Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelGenerator.GenerateModel(列表1 errors) en Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelBuilderEngine.GenerateModels(String storeModelNamespace, ModelBuilderSettings settings, List1 错误) zh Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelBuilderEngine.GenerateModel(ModelBuilderSettings 设置,IVsUtils vsUtils,ModelBuilderEngineHostContext 主机上下文)'。 La carga de los metadatos desde la base de datos tardó 00:00:00.4029113。 La generación del modelo tardó 00:03:36.0692240.

我们已经证明,如果我们将所有单列作为主键一切正常,当一列不是主键时就会出现问题,这与列的类型无关。

我在互联网上没有找到有同样问题的人。

非常感谢您阅读我的问题

问候

【问题讨论】:

【参考方案1】:

实体框架(版本 6.1.3)和 MySQL 服务器(5.7)

解决问题的一种方法是,

    打开服务 (services.msc) 并重启 MySQL57 服务。

    在 MySQL 中执行以下命令。

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

    更新 .edmx。

【讨论】:

它确实对我有用,但我必须在更新 EDMX 之前重新启动 Visual Studio。【参考方案2】:

我已经指出,此错误仅出现在与处于候选发布状态的 5.7.8 mysql 服务器的连接中。使用最新的稳定版本 5.6.25,实体框架可以正常工作。

【讨论】:

MySql V5.7.9 GA 版本,bug 仍未修复bugs.mysql.com/bug.php?id=79163【参考方案3】:

这是错误的英文版本。它也适用于 VS2015 和 MySQL.Data 6.9.7

    Unable to generate the model because of the following exception: 'System.Data.StrongTypingException: The value for column 'IsPrimaryKey' in table 'TableDetails' is DBNull. ---> System.InvalidCastException: Specified cast is not valid.
    at Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.SchemaDiscovery.TableDetailsRow.get_IsPrimaryKey()
    --- End of inner exception stack trace ---
    at Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.SchemaDiscovery.TableDetailsRow.get_IsPrimaryKey()
    at Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.StoreModelBuilder.CreateProperties(IList`1 columns, IList`1 errors, List`1& keyColumns, List`1& excludedColumns, List`1& invalidKeyTypeColumns)
    at Microsoft.Data.Entity.Design.VersioningFacade.ReverseEngineerDb.StoreModelBuilder.CreateEntityType(IList`1 columns, Boolean& 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()
    at Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelGenerator.GenerateModel(List`1 errors)
    at Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelBuilderEngine.GenerateModels(String storeModelNamespace, ModelBuilderSettings settings, List`1 errors)
    at Microsoft.Data.Entity.Design.VisualStudio.ModelWizard.Engine.ModelBuilderEngine.GenerateModel(ModelBuilderSettings settings, IVsUtils vsUtils, ModelBuilderEngineHostContext hostContext)'.

【讨论】:

更新:我现在已经尝试了所有以前版本的 Entity Framework 到 5.0.0.0 并且它是同样的错误。【参考方案4】:

我遇到了同样的问题,我卸载了 mysql server 5.7 x64 和 intallig mysql server 5.5 x86 解决了。

希望对你有帮助

【讨论】:

我不得不回滚到 5.6.31 x86,它现在可以工作了。

以上是关于当列不是 PK 时,EF6 MySQL StrongTypingException的主要内容,如果未能解决你的问题,请参考以下文章

当列的值相等时在同一个 MySQL 表上更新行

当列不明确时,有啥方法可以强制 Mysql 在 where 子句中使用 select 中的列?

当列是 JSON 数组而不是字符串时如何过滤 ANTD 表

当列包含`List`而不是`Tuple`时,熊猫比较运算符`==`无法按预期工作

4.07每日总结

具有EF6子集合的父/子总是为空