EF6 codefirst + MySql迁移:不支持类型nvarchar(max)

Naf*_*tis 8 mysql entity-framework ef-migrations

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

The underlying provider does not support the type 'nvarchar(max)'
Run Code Online (Sandbox Code Playgroud)

因此,即使我在配置中更改了默认连接工厂,因此EF似乎正在尝试将SQLServer类型用于MySql.

我可以用相同的错误消息找到很多问题但是它们似乎都不是最新的或者建议我还没有尝试过的东西.以下是我在MySql的DAL dll中启用迁移的步骤,是否有人可以提示?

(1)添加NuGet :

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

(2)在文件中添加MySql 的连接字符串App.config,如:

(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)
Run Code Online (Sandbox Code Playgroud)

(3)另外,确保NuGet按照规定修改了配置(在我的情况下App.config):

  • 替换默认连接工厂:

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

  • 添加MySql提供程序:

    (provider invariantname ="MySql.Data.MySqlClient"type ="MySql.Data.MySqlClient.MySqlProviderServices,MySql.Data.Entity.EF6,Version = 6.8.3.0,Culture = neutral,PublicKeyToken = c5687fc88969c44d"/)

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

    (system.data)(dbproviderfactories)(remove name ="MySQL Data Provider"invariant ="MySql.Data.MySqlClient"/)(add name ="MySQL Data Provider"invariant ="MySql.Data.MySqlClient"description =".用于MySQL的Net Framework数据提供程序"type ="MySql.Data.MySqlClient.MySqlClientFactory,MySql.Data,Version = 6.8.3.0,Culture = neutral,PublicKeyToken = c5687fc88969c44d"/)(/ dbproviderfactories)(/ s​​ystem.data)

(4)手动添加代码配置类型属性(我不想触摸我的数据上下文代码,因为它必须保持通用),如http://dev.mysql.com/doc/connector-net/en/所建议的那样connector-net-entityframework60.html:

(entityframework codeconfigurationtype="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6")
Run Code Online (Sandbox Code Playgroud)

我的POCO对象中的一些字符串属性没有必要的最大长度,nvarchar(max)text在MySql中.然而,我得到了上面引用的错误,这个堆栈跟踪:

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)'.
Run Code Online (Sandbox Code Playgroud)

任何提示?

Met*_*ian 5

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

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

由于某种原因,当在解决方案资源管理器中删除迁移没有效果时,这对我起了作用。显然,这并没有删除数据库中的迁移历史记录......


Aro*_*ers 0

以下步骤给我带来了相同的错误消息:

  1. 使用实体框架和 SQL Server 创建一个项目并进行迁移。使用模型类中string没有的一些属性MaxLength,这些属性映射到nvarchar(max).
  2. 像上面一样为空的 MySQL 数据库重新配置 MySQL。
  3. 跑步Update-Database

在撰写本文时使用所有最新的软件版本库。

收到错误后,我尝试设置[MaxLength(..)]所有字符串属性。即使在使用 重新进行迁移时,错误消息仍然不断出现Add-Migration Initial -Force

就我而言,事实证明,Update-Database对我的 MySQL 数据库(运行用于 SQL Server 的旧迁移,包括nvarchar(max))的调用对我的数据库产生了一些影响,即创建了表,但不是全部。

我的解决方案是:

  1. 删除这些表,确保数据库再次为空。
  2. Enable-Migrations -Force
  3. Add-Migration Initial -Force
  4. Update-Database

请注意,这些步骤会覆盖对迁移和Seed()功能的任何手动更改,您可能希望有选择地恢复这些更改。

之后我测试了没有[MaxLength(..)]. 这些可以很好地与 MySQL 提供程序一起使用,它们被映射到longtext.