我原来的项目是asp.net mvc5 + entityframework 6.4 for sql server(localdb,sql server),现在需要把数据库切换成mysql,理论上entityframework是可以完全做到无缝切换,毕竟ORM的设计就是为了兼容不同的底层数据库。
1 <connectionStrings>
2 <remove name="DefaultConnection"/>
3 <!--使用scaffold生成controller 时要先注销以下配置-->
4 <add name="DefaultConnection" connectionString="server=localhost;port=3306;database=webapp;uid=root;password=root;Persist Security Info=True" providerName="MySql.Data.MySqlClient" />
5 <!--<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB; Initial Catalog=webappv4;Integrated Security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />-->
6 </connectionStrings>
7 <!--<entityFramework >
8 <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
9 <providers>
10 <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
11 </providers>
12 </entityFramework>-->
13 <!--使用scaffold生成controller 时要先注销以下配置-->
14 <entityFramework codeConfigurationType="MySql.Data.EntityFramework.MySqlEFConfiguration, MySql.Data.EntityFramework">
15 <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
16 <parameters>
17 <parameter value="mssqllocaldb" />
18 </parameters>
19 </defaultConnectionFactory>
20 <providers>
21 <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
22 <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.EntityFramework, Version=8.0.20.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
23
24 </providers>
25 </entityFramework>
26 <system.data>
27 <DbProviderFactories>
28 <remove invariant="MySql.Data.MySqlClient" />
29 <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=8.0.20.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
30 </DbProviderFactories>
31 </system.data>
1 //执行命令前先删除项目Migrations下的文件
2 enable-migrations
3 add-migration md_init
1 protected override void OnModelCreating(DbModelBuilder modelBuilder)
2 {
3 //Oracle 表所有者,(SQL 改成 dbo(默认),也可删除此设置)
4 modelBuilder.HasDefaultSchema(string.Empty);
5 //默认把string类型转换成nvarchar,原本nlogtext
6 modelBuilder.Properties<string>().Configure(c => c.IsUnicode(false));
7 base.OnModelCreating(modelBuilder);
8
9
10 }
通常情况做完这些修改就可以运行起来了。
再使用scaffold生成controller的时候会报错,这样的错误网上一搜一堆,但所有的解决方法我都试了,不行。无解,问题应该是mysql.data.entityframework的问题我用vs.net 2019,暂时没有在其它低版本下试过。
目前我的解决方法是,通过修改web.config,在需要用scaffold生成controller的时候把涉及到mysql entityframework的配置全部还原成sql server的配置,等生成成功了,在把配置改回到mysql.
我不知道你们有没有遇到这样的问题,有完美解决的解决方案吗。如果知道的请留言,不甚感激