mysql - EF6 codefirst + MySql 迁移 : type nvarchar(max) not supported

标签 mysql entity-framework entity-framework-migrations

我尝试首先使用 EF6 代码 + MySql 进行迁移,但在 add-migration 期间我遇到了这个错误:

The underlying provider does not support the type 'nvarchar(max)'

因此,即使我更改了配置中的默认连接工厂,EF 似乎也在尝试为 MySql 使用 SQLServer 类型。

我可以找到很多带有相同错误消息的问题,但它们似乎都不是最新的,也没有提出我尚未尝试过的建议。这是我在 MySql 的 DAL dll 中启用迁移的步骤,任何人都可以给出提示吗?

(1) 添加 NuGet :

  • MySql.ConnectorNET.Data
  • MySql.ConnectorNET.Entity

(2) 在App.config文件中为MySql添加一个connection string,如:

(connectionStrings)
(add name="MySqlConn" 
     connectionString="Data Source=127.0.0.1;Port=3306;Database=dummy;User id=***;Password=***;charset=utf8" 
     providerName="MySql.Data.MySqlClient" /)
(/connectionStrings)

(3) 此外,确保 配置(在我的例子中是 App.config)已按指定由 NuGet 修改:

  • 替换默认连接工厂:

    (defaultconnectionfactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6"/)

  • 添加 MySql 提供程序:

    (提供者不变名称=“MySql.Data.MySqlClient” type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/)

  • 将提供程序添加到 system.data:

    (系统.数据) (数据库供应商工厂) (删除名称="MySQL 数据提供程序"invariant="MySql.Data.MySqlClient"/) (添加名称 =“MySQL 数据提供程序” invariant="MySql.Data.MySqlClient" description=".Net Framework MySQL 数据提供程序" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/) (/dbproviderfactories) (/系统.数据)

(4) 手动添加code configuration type 属性(我不想触及我的数据上下文代码,因为它必须保持通用),如http://dev.mysql.com/doc/connector-net/en/connector-net-entityframework60.html 所推荐:

(entityframework codeconfigurationtype="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6")

我的 POCO 对象中的几个字符串属性没有最大长度,因为它们必须是 nvarchar(max),即 MySql 中的 text。然而,我得到上面引用的错误,这个堆栈跟踪:

System.ArgumentException: The underlying provider does not support the type 'nvarchar(max)'.
   at MySql.Data.MySqlClient.MySqlProviderManifest.GetEdmType(TypeUsage storeType)
   at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.BuildColumnModel(EdmProperty property, ModelMetadata modelMetadata, IDictionary`2 annotations)
   at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.BuildAlterColumnOperation(String table, EdmProperty targetProperty, ModelMetadata targetModelMetadata, EdmProperty sourceProperty, ModelMetadata sourceModelMetadata)
   at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.(FindAlteredColumns)b__24b(()f__AnonymousType2c`2 ()h__TransparentIdentifier243)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(ModelMetadata source, ModelMetadata target, Lazy`1 modificationCommandTreeGenerator, MigrationSqlGenerator migrationSqlGenerator, String sourceModelVersion, String targetModelVersion)
   at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(XDocument sourceModel, XDocument targetModel, Lazy`1 modificationCommandTreeGenerator, MigrationSqlGenerator migrationSqlGenerator, String sourceModelVersion, String targetModelVersion)
   at System.Data.Entity.Migrations.DbMigrator.Scaffold(String migrationName, String namespace, Boolean ignoreChanges)
   at System.Data.Entity.Migrations.Design.MigrationScaffolder.Scaffold(String migrationName, Boolean ignoreChanges)
   at System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.Scaffold(MigrationScaffolder scaffolder)
   at System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.Run()
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Scaffold(String migrationName, String language, String rootNamespace, Boolean ignoreChanges)
   at System.Data.Entity.Migrations.AddMigrationCommand.Execute(String name, Boolean force, Boolean ignoreChanges)
   at System.Data.Entity.Migrations.AddMigrationCommand.()c__DisplayClass2.(.ctor)b__0()
   at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
The underlying provider does not support the type 'nvarchar(max)'.

有什么提示吗?

最佳答案

我整晚都在为同样的错误而苦苦挣扎。修复是违反直觉的,但到目前为止一切顺利......看起来这个问题确实与使用 LocalDB(SQL Server)设置的旧迁移有关,但即使删除旧迁移也没有效果。我还花了很多不必要的时间摆弄我的 Web.config、数据库上下文等...我建议在用头撞墙之前尝试以下操作...

  1. 删除迁移文件夹
  2. 尝试启用迁移并添加您的初始迁移(在 PM 中键入“enable-migrations”,然后键入“add-migration init”)
  3. 如果您在 PM 中遇到上述错误,请再次删除 migrations 文件夹,然后打开 MySQL Workbench
  4. 在 MySQL Workbench 中,使用您在 connectionString 中提供的名称找到架构(看起来像 database=whateverYouCalledIt)
  5. 在该架构中,打开表并找到“__migrationhistory”
  6. 右键单击该表,单击“选择行”,删除任何现有的迁移条目,然后重复第 2 步

出于某种原因,当在解决方案资源管理器中删除迁移无效时,这对我有用。显然,这并没有删除数据库中的迁移历史……

关于mysql - EF6 codefirst + MySql 迁移 : type nvarchar(max) not supported,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24496960/

相关文章:

Mysql 复合索引与 tenant_id

php - Sql INSERT INTO 组合值和选择失败

c# - 如何使 WHERE 子句中的项目可选?

c# - Entity Framework Core 6.0 中默认情况下字符串不可为空

c# - DbMigrationsConfiguration 如何与 EF 中的 DbMigration 相关

entity-framework - 发布 Web 对话框未将我的 Entity Framework 5 上下文检测为 Code First

MySQL 对具有多个条件的多个表进行计数

mysql选择每个月的记录数

c# - 使用动态 Linq 查询子字符串时出错

c# - 如何从数据库读取图形图像并将其作为文件粘贴到剪贴板?