Naf*_*tis 8 mysql entity-framework ef-migrations
我正在尝试首先使用EF6代码+ MySql进行迁移,但我在以下期间遇到此错误add-migration:
The underlying provider does not support the type 'nvarchar(max)'
Run Code Online (Sandbox Code Playgroud)
因此,即使我在配置中更改了默认连接工厂,因此EF似乎正在尝试将SQLServer类型用于MySql.
我可以用相同的错误消息找到很多问题但是它们似乎都不是最新的或者建议我还没有尝试过的东西.以下是我在MySql的DAL dll中启用迁移的步骤,是否有人可以提示?
(1)添加NuGet 包:
MySql.ConnectorNET.DataMySql.ConnectorNET.Entity(2)在文件中添加MySql 的连接字符串App.config,如:
(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)
Run Code Online (Sandbox Code Playgroud)
(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:
(system.data)(dbproviderfactories)(remove name ="MySQL Data Provider"invariant ="MySql.Data.MySqlClient"/)(add name ="MySQL Data Provider"invariant ="MySql.Data.MySqlClient"description =".用于MySQL的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/所建议的那样connector-net-entityframework60.html:
(entityframework codeconfigurationtype="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6")
Run Code Online (Sandbox Code Playgroud)
我的POCO对象中的一些字符串属性没有必要的最大长度,nvarchar(max)即text在MySql中.然而,我得到了上面引用的错误,这个堆栈跟踪:
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)'.
Run Code Online (Sandbox Code Playgroud)
任何提示?
我整个晚上都在为同样的错误而苦苦挣扎。该修复是违反直觉的,但到目前为止还不错...似乎问题确实与使用 LocalDB (SQL Server) 设置的旧迁移有关,但即使删除旧迁移也没有效果。我还花了很多不必要的时间摆弄我的 Web.config、数据库上下文等...我建议在把头撞到墙上之前尝试以下操作...
由于某种原因,当在解决方案资源管理器中删除迁移没有效果时,这对我起了作用。显然,这并没有删除数据库中的迁移历史记录......
以下步骤给我带来了相同的错误消息:
string没有的一些属性MaxLength,这些属性映射到nvarchar(max).Update-Database。在撰写本文时使用所有最新的软件版本库。
收到错误后,我尝试设置[MaxLength(..)]所有字符串属性。即使在使用 重新进行迁移时,错误消息仍然不断出现Add-Migration Initial -Force。
就我而言,事实证明,Update-Database对我的 MySQL 数据库(运行用于 SQL Server 的旧迁移,包括nvarchar(max))的调用对我的数据库产生了一些影响,即创建了表,但不是全部。
我的解决方案是:
Enable-Migrations -ForceAdd-Migration Initial -ForceUpdate-Database请注意,这些步骤会覆盖对迁移和Seed()功能的任何手动更改,您可能希望有选择地恢复这些更改。
之后我测试了没有[MaxLength(..)]. 这些可以很好地与 MySQL 提供程序一起使用,它们被映射到longtext.