asp.net mvc entityframework sql server 迁移至 mysql方法以及遇到的问题
背景:
我原来的项目是asp.net mvc5 + entityframework 6.4 for sql server(localdb,sql server),现在需要把数据库切换成mysql,理论上entityframework是可以完全做到无缝切换,毕竟ORM的设计就是为了兼容不同的底层数据库。
步骤:
- 下载 mysql-connector-net-8.0.20.msi 并安装(其实没有什么必要,可以直接从nuget下安装)
- nuget 安装 MySql.Data.EntityFramework,MySql.Data,注意:MySql.Data.Entity 和 MySql.Data.EntityFramework 应该只要一个就好了,我就安装 MySql.Data.EntityFramewor
- 配置webconfig
<connectionStrings>
<remove name="DefaultConnection"/>
<!--使用scaffold生成controller 时要先注销以下配置-->
<add name="DefaultConnection" connectionString="server=localhost;port=3306;database=webapp;uid=root;password=root;Persist Security Info=True" providerName="MySql.Data.MySqlClient" />
<!--<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB; Initial Catalog=webappv4;Integrated Security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />-->
</connectionStrings>
<!--<entityFramework >
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>-->
<!--使用scaffold生成controller 时要先注销以下配置-->
<entityFramework codeConfigurationType="MySql.Data.EntityFramework.MySqlEFConfiguration, MySql.Data.EntityFramework">
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.EntityFramework, Version=8.0.20.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> </providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="MySql.Data.MySqlClient" />
<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" />
</DbProviderFactories>
</system.data>web.config
修改dbcontext
// 使用scaffold生成controller 时要先注销以下配置
[DbConfigurationType(typeof(MySqlEFConfiguration))]
public class StoreContext : DbContext
{ public StoreContext()
: base("name=DefaultConnection") {
//获取登录用户信息,tenantid
//QueryFilterManager.AllowPropertyFilter = true;
//var claimsidentity = (ClaimsIdentity)HttpContext.Current.User?.Identity;
//var tenantclaim = claimsidentity?.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid");
//var tenantid = Convert.ToInt32(tenantclaim?.Value);
//设置当对Work对象进行查询时默认添加过滤条件
//QueryDbSetFilterManager.Filter<Work>(q => q.Where(x => x.TenantId == tenantid));
//this.Filter<Work>(q => q.Where(x => x.TenantId == tenantid));
//设置当对Order对象进行查询时默认添加过滤条件
//QueryDbSetFilterManager.Filter<Order>(q => q.Where(x => x.TenantId == tenantid));
//this.Filter<Order>(q => q.Where(x => x.TenantId == tenantid));
//QueryDbSetFilterManager.InitilizeGlobalFilter(this); }
}dbcontext.cs
- 执行迁移命令,重新创建数据库表名
//执行命令前先删除项目Migrations下的文件
enable-migrations
add-migration md_initpm>
- 修改 dbcontext
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//Oracle 表所有者,(SQL 改成 dbo(默认),也可删除此设置)
modelBuilder.HasDefaultSchema(string.Empty);
//默认把string类型转换成nvarchar,原本nlogtext
modelBuilder.Properties<string>().Configure(c => c.IsUnicode(false));
base.OnModelCreating(modelBuilder); }
测试
通常情况做完这些修改就可以运行起来了。
遇到的问题
再使用scaffold生成controller的时候会报错,这样的错误网上一搜一堆,但所有的解决方法我都试了,不行。无解,问题应该是mysql.data.entityframework的问题我用vs.net 2019,暂时没有在其它低版本下试过。
目前我的解决方法是,通过修改web.config,在需要用scaffold生成controller的时候把涉及到mysql entityframework的配置全部还原成sql server的配置,等生成成功了,在把配置改回到mysql.
我不知道你们有没有遇到这样的问题,有完美解决的解决方案吗。如果知道的请留言,不甚感激
asp.net mvc entityframework sql server 迁移至 mysql方法以及遇到的问题的更多相关文章
- ASP.NET MVC与Sql Server交互,把字典数据插入数据库
在"ASP.NET MVC与Sql Server交互, 插入数据"中,在Controller中拼接sql语句.比如: _db.InsertData("insert int ...
- ASP.NET MVC与Sql Server交互, 插入数据
在"ASP.NET MVC与Sql Server建立连接"中,与Sql Server建立了连接.本篇实践向Sql Server中插入数据. 在数据库帮助类中增加插入数据的方法. p ...
- Incorporating ASP.NET MVC and SQL Server Reporting Services, Part 2
In the last issue, I introduced you to the basics of incorporating SQL Server Reporting Services int ...
- 从Microsoft SQL Server迁移到MySQL指南
转自 https://www.mysql.com/why-mysql/white-papers/sql-server-to-mysql-zh/ 由于 MySQL 将节约成本.自由选择平台.特性丰富等优 ...
- Incorporating ASP.NET MVC and SQL Server Reporting Services, Part 1
Your ASP.NET MVC application needs reports. What do you do? In this article, I will demonstrate how ...
- ASP.NET MVC与Sql Server建立连接
用惯了使用Entity Framework连接数据库,本篇就来体验使用SqlConnection连接数据库. 打开Sql Server 2008,创建数据库,创建如下表: create table P ...
- abp项目 从sql server迁移至mysql
官方资料:https://aspnetboilerplate.com/Pages/Documents/EF-MySql-Integration 实验发现,还差了两步 整理一下,步骤如下: 1.引用My ...
- (转)如何将数据库从SQL Server迁移到MySQL
一.迁移Database Schema. 首 先使用Sybase Powerdesigner的逆向工程功能,逆向出SQL Server数据库的物理模型.具体操作是在Powerdesigner中选择“F ...
- SQL Server 迁移至MySQL 关键步骤的梳理总结
迁移主要是通过Navicat工具来实现的.迁移工具的选定在此不讨论. 迁移前准备 1.提前通知DBA\SA\BI等,并确认发布计划及数据库迁移方案. 2.梳理出SQL Server DB 中影响业务 ...
随机推荐
- 如何教零基础的人认识Python
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 编程派 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...
- Daily Scrum 1/14/2016
Zhaoyang & Yandong: Still optimizing the speech input interface Dong & Fuchen: Image asynchr ...
- 如何将Python项目发布到PyPI
The Python Package Index (PyPI) is a repository of software for the Python programming language. 如何打 ...
- wordpress 常用操作
删除主题 在主题目录 wp-content/themes 中直接删除即可. 首页和文章页使用不同主题 首页使用sidebar,文章页不使用sidebar,这样文章的内容可以占更宽的页面 安装插件 Mu ...
- 2019-2020-1 20199308《Linux内核原理与分析》第七周作业
<Linux内核分析> 第六章 进程的描述和进程的创建 6.1 进程的描述 操作系统内核实现操作系统的三大管理功能: 进程管理(进程)-核心 内存管理(虚拟内存) 文件系统(文件) 为了管 ...
- VirtualBox 原始镜像转换成 vdi 镜像
VBoxManage convertdd [-static] <filename> <outputfile> 将raw硬盘转换成vdi虚拟硬盘
- 鸟哥Linux私房菜(基础篇)——第五章:首次登入与在线求助 man page笔记
1.X Winsows与文本模式的切换 ●[Ctrl] + [Alt] + [F1] ~ [F6] :文字接口登入 tty1 ~ tty6 终端机. ●[Ctrl] + [Alt] + ...
- 【Linux常见命令】touch命令
touch - change file timestamps touch [文件名] 就是“摸”一下文件,如果文件不存在,就建立新文件:如果文件存在,就改变文件的访问时间atime等时间戳信息. 语法 ...
- 再也不用c刷题了!!——c++刷题必备
致读者: 博主是一名数据科学与大数据专业大二的学生,真正的一个互联网萌新,写博客一方面是为了记录自己的学习历程,一方面是希望能够帮助到很多和自己一样处于困惑的读者.由于水平有限,博客中难免会有一些错误 ...
- CCS进阶——div的宽度和高度是由什么决定的?
核心知识 文档流/普通流(Normal Flow) 内联元素的宽高(高度是由行高决定的,宽度=内容+border+marging+padding) 块级元素的宽高(高度是内部文档流元素的高度总和,宽度 ...