前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >asp.net mvc entityframework sql server 迁移至 mysql方法以及遇到的问题

asp.net mvc entityframework sql server 迁移至 mysql方法以及遇到的问题

作者头像
阿新
发布2020-05-12 13:12:24
1.3K0
发布2020-05-12 13:12:24
举报
文章被收录于专栏:c#开发者c#开发者

背景:

  我原来的项目是asp.net mvc5 + entityframework 6.4 for sql server(localdb,sql server),现在需要把数据库切换成mysql,理论上entityframework是可以完全做到无缝切换,毕竟ORM的设计就是为了兼容不同的底层数据库。

步骤:

  1. 下载 mysql-connector-net-8.0.20.msi 并安装(其实没有什么必要,可以直接从nuget下安装)
  2. nuget 安装 MySql.Data.EntityFramework,MySql.Data,注意:MySql.Data.Entity 和 MySql.Data.EntityFramework 应该只要一个就好了,我就安装 MySql.Data.EntityFramewor
  3. 配置webconfig 修改dbcontext 1 // 使用scaffold生成controller 时要先注销以下配置 2 [DbConfigurationType(typeof(MySqlEFConfiguration))] 3 public class StoreContext : DbContext 4 { 5 6 7 public StoreContext() 8 : base("name=DefaultConnection") { 9 //获取登录用户信息,tenantid 10 //QueryFilterManager.AllowPropertyFilter = true; 11 //var claimsidentity = (ClaimsIdentity)HttpContext.Current.User?.Identity; 12 //var tenantclaim = claimsidentity?.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid"); 13 //var tenantid = Convert.ToInt32(tenantclaim?.Value); 14 //设置当对Work对象进行查询时默认添加过滤条件 15 //QueryDbSetFilterManager.Filter<Work>(q => q.Where(x => x.TenantId == tenantid)); 16 //this.Filter<Work>(q => q.Where(x => x.TenantId == tenantid)); 17 //设置当对Order对象进行查询时默认添加过滤条件 18 //QueryDbSetFilterManager.Filter<Order>(q => q.Where(x => x.TenantId == tenantid)); 19 //this.Filter<Order>(q => q.Where(x => x.TenantId == tenantid)); 20 //QueryDbSetFilterManager.InitilizeGlobalFilter(this); 21 22 } 23 }
代码语言:javascript
复制
 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. 执行迁移命令,重新创建数据库表名
代码语言:javascript
复制
1 //执行命令前先删除项目Migrations下的文件
2 enable-migrations 
3 add-migration md_init
  1. 修改 dbcontext 
代码语言:javascript
复制
 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.

我不知道你们有没有遇到这样的问题,有完美解决的解决方案吗。如果知道的请留言,不甚感激

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景:
  • 步骤:
  • 测试
  • 遇到的问题
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档