【问题标题】:EF6 codefirst + MySql migrations: type nvarchar(max) not supportedEF6 codefirst + MySql 迁移:不支持类型 nvarchar(max)
【发布时间】:2014-08-21 05:28:24
【问题描述】:

我正在尝试首先使用 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) 另外,请确保 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:

    (系统.数据) (dbproviderfactories) (去掉name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" /) (添加名称=“MySQL 数据提供者” 不变量=“MySql.Data.MySqlClient” description=".Net 框架 MySQL 数据提供程序" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, 版本=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /) (/dbproviderfactories) (/system.data)

(4) 按照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)'.

有什么提示吗?

【问题讨论】:

  • 6 个月后,我完全遇到了同样的问题。我本可以把这个问题写到最后一个细节。你有没有偶然得到任何答案?
  • 不幸的是我没有。如果我找到任何解决方案(除了通过属性或流畅的语法显式设置类型),我会在这里发布。至少我并不孤单:)
  • 我确实发现了一些有趣的东西。我试图从使用 mssql 转换项目,所以我已经进行了一些迁移。通常,由于我们的错误,您甚至无法运行 add-migration。但是,由于我已经有了迁移文件,所以我可以运行 update-database...它运行所有迁移就好了,但是在添加了所有架构更改之后,它就出现了这个错误...我'我猜测它发生在播种前第一次启动上下文时。我能够通过更新数据库成功前滚(和后滚),这简直太疯狂了。
  • 就像 EF 为迁移代码使用一个提供者,而为上下文使用不同的提供者。
  • 由于我的数据模型中没有 longtext/text/nvarchar(max)/varchar(max) 字段,这让我更加恼火。

标签: mysql entity-framework entity-framework-migrations


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    以下步骤对我产生了相同的错误消息:

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

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

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

    在我的情况下,事实证明,在我的 MySQL 数据库(运行用于 SQL Server 的旧迁移,包括 nvarchar(max))上对 Update-Database 的调用对我的数据库造成了一些影响,即正在创建的表,但不是全部。

    我的解决方案是:

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

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

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

    【讨论】:

      【解决方案3】:

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

      一旦我找到了所有这些并添加了 maxlength,一切都运行良好。 AddColumn("dbo.RoundJumperMap", "VideoUrl", c => c.String(maxLength: 1000));

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

      【讨论】:

        猜你喜欢
        • 2021-10-28
        • 1970-01-01
        • 2018-01-09
        • 2011-07-02
        • 1970-01-01
        • 2011-07-17
        • 1970-01-01
        • 2015-05-14
        相关资源
        最近更新 更多