【发布时间】: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.DataMySql.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