gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 06:33:55 27 4
gpt4 key购买 nike

我尝试首先使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com