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,数据库上下文等等......我建议在将你的头撞到墙上之前尝试以下内容......
出于某种原因,当我在解决方案资源管理器中删除迁移时没有任何效果时,我完成了这个技巧。 显然,这并没有删除数据库中的迁移历史记录......
以下步骤对我造成了相同的错误消息:
MaxLength
string
属性,它们映射到nvarchar(max)
。 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?