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

我试图首先使用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添加连接字符串 ,如:

    (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提供程序:

    (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)(删除name =“MySQL Data Provider”invariant =“MySql.Data.MySqlClient”/)(add name =“MySQL Data Provider”invariant =“MySql.Data.MySqlClient”description =“。 Net Framework的数据提供程序“(type =”MySql.Data.MySqlClient.MySqlClientFactory,MySql.Data,Version = 6.8.3.0,Culture = neutral,PublicKeyToken = c5687fc88969c44d“/)(/ dbproviderfactories)(/system.data)

  • (4)按照http://dev.mysql.com/doc/connector-net/en/中的建议,手动添加代码配置类型属性(我不喜欢触及我的数据上下文代码,因为它必须保持通用)。连接器净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,数据库上下文等等......我建议在将你的头撞到墙上之前尝试以下内容......

  • 删除迁移文件夹
  • 尝试启用迁移并添加最初的迁移(在PM类型“enable-migrations”中,然后是“add-migration init”)
  • 如果在PM中出现上述错误,请再次删除migrations文件夹,然后打开MySQL Workbench
  • 在MySQL Workbench中,使用您在connectionString中给出的名称来查找Schema(将看起来像数据库= whateverYouCalledIt)
  • 在该模式中,打开表格并找到“__migrationhistory”
  • 右键单击该表,单击选择行并删除任何现有的迁移条目,然后重复步骤2
  • 出于某种原因,当我在解决方案资源管理器中删除迁移时没有任何效果时,我完成了这个技巧。 显然,这并没有删除数据库中的迁移历史记录......


    以下步骤对我造成了相同的错误消息:

  • 使用实体框架和SQL Server创建项目并进行迁移。 在模型类中使用一些没有MaxLength string属性,它们映射到nvarchar(max)
  • 像上面那样为MySQL重新配置一个空的MySQL数据库。
  • 运行Update-Database
  • 在撰写时使用所有最新的软件版本库。

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

    在我的情况下,事实证明,我的MySQL数据库(运行包含nvarchar(max) SQL Server旧迁移意味着Update-Database对我的数据库产生了一些影响,即创建表,但并非全部。

    对我来说,解决方案是:

  • 删除这些表格,确保数据库再次为空。
  • Enable-Migrations -Force
  • Add-Migration Initial -Force
  • Update-Database
  • 请注意,这些步骤会覆盖对您的迁移和Seed()函数的任何手动更改,您可能需要选择性地还原这些。

    在此之后,我没有[MaxLength(..)]测试字符串属性。 这些可以在MySQL提供程序中使用,它们被映射到longtext


    我有同样的问题,并发现根本原因是现有的迁移,看起来像这样: AddColumn("dbo.RoundJumperMap", "VideoUrl", c => c.String());

    一旦我找到所有这些,并增加了最大长度,一切都很顺利。 AddColumn("dbo.RoundJumperMap", "VideoUrl", c => c.String(maxLength: 1000));

    我不需要删除任何现有的迁移或类似的东西。

    链接地址: http://www.djcxy.com/p/72713.html

    上一篇: EF6 codefirst + MySql migrations: type nvarchar(max) not supported

    下一篇: Strange exception: Active Project's DLL being referenced in two places?