在开发的初期个人认为因VS与Sqlserver的配合很默契,即可以方便的实现Code First,又可以使用SqlServer Manager很漂亮的进行建模与变更,也许是个人的使用习惯MS的界面做的很好,似乎开源的产品美感上都追不上商用版。

所以个人比较喜欢的开发流程是初次开发以SqlServer Manager进行数据库建模,初步建构业务逻辑;

其次使用Vs的Entity FrameWork 快速的建立起ROM;

最后当开发进行到一定程度时再进行数据库迁移,把SqlServer 转换为MySql。

一、环境:Win 8.1 + Vs2012 + MysqlServer 5.7 + WorkBench 6.0 CE

注意事项:

1. 在某种怪异的情况下Win 8.1 + vs2012 +mysql 5.7 此种搭配是无法使用的,在StackOverFlow中也有很多码友们,包括身边的同事也都有遇到过类似问题,

现象是在Win8.1下安装mysql5.7 时,mysql for vs2012 与 mysql connection net 5.7无法正常安装,即使卸载Mysql也无用,自然在Vs2012中添加Ado.net entity model时未有Mysql conncetion集成到Vs中,但往往在Vs的SqlServer Explore中你可以添加Mysql,但不要试图填写conncetion string,因为那样会让您老人家Vs崩溃。

原因可能是Mysql 在配合MS的新家伙Win 8.1 系统时有Bug存在。

解决办法:此种情况并非每次都会出现,但出现以后很难解决,如果哪位码友知道请赐教;重装系统或者自己运气好,软件自动修复了。

2.使用WorkBench可以很方便的进行数据库迁移,很人性化,自动把SqlServer转为MySql,但某些字段的转换会失败,需要手动修复了。

3.在Vs连接Mysql时不要使用Root,尽量配置以项目为区分的私有帐户,这样可以最大化的实现自定义,配置为允许远程连接的即可。

4.在VS2012创建MySql的Ado.net entity framework时生成的实体全是小写,会使原有建立在SqlServer实体化基础上的代码出现问题,木有关系,把原来的Copy过来即可,Simple.

不过还有一个办法就是使用DbLinq(https://code.google.com/p/dblinq2007/)来替代EF,但不建议使用在正规场合,学习可以,因为其最终版本是2007年,此后再无更新。

二、流程:

  数据库迁移:直接使用WorkBench进行数据库从SqlServer 迁移到MySql。

  代码迁移:  

  1.  确保成功安装Connector NET 6.7.4 与 MySQL for Visual Studio 1.0.2

  2.  创建MVC3 Web Application,添加引用从NuGet或者MySQL for Visual Studio 1.0.2中获取最新版本的三个DLL:MySql.Data,MySql.Data.Entity,MySql.Web。

  3.  如果以上步骤OK的话,当向项目中添加Ado.net entity framework时,New Connection 就可以看到Mysql database选项,否则你就倒霉了,可以参考环境->注意事项;

  4.  修改Web.Config,需要增加及修改的示例代码如下:

<connectionStrings>
<add name="MySQLConnString"
connectionString="Server=192.168.29.157;Port=3306;Database=**;Uid=**;Pwd=**;"
providerName="MySql.Data.MySqlClient" />
<add name="newsoftgatewayEntities"
connectionString="metadata=res://*/NewsoftGateWay.csdl|res://*/NewsoftGateWay.ssdl|res://*/NewsoftGateWay.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=192.168.29.157;user id=**;password=**;database=newsoftgateway&quot;"
providerName="System.Data.EntityClient" />
</connectionStrings>
  <system.web>
<membership defaultProvider="MySqlMembershipProvider">
<providers>
<clear />
<add name="MySqlMembershipProvider"
type="MySql.Web.Security.MySQLMembershipProvider,MySql.Web,Version=6.7.4,Culture=neutral,PublicKeyToken=c5687fc88969c44d"
connectionStringName="MySQLConnString" enablePasswordRetrieval="false" enablePasswordReset="true"
requiresQuestionAndAnswer="false" requiresUniqueEmail="true" passwordFormat="Hashed"
maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0"
passwordAttemptWindow="10" applicationName="/" autogenerateschema="true" />
</providers>
</membership>
<profile>
<providers>
<clear />
<add name="MySQLProfileProvider"
type="MySql.Web.Profile.MySQLProfileProvider, MySql.Web, Version=6.7.4.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"
connectionStringName="MySQLConnString" applicationName="/" />
</providers>
</profile>
<roleManager enabled="true" defaultProvider="MySQLRoleProvider">
<providers>
<clear />
<add name="MySQLRoleProvider"
type="MySql.Web.Security.MySQLRoleProvider, MySql.Web,Version=6.7.4.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"
connectionStringName="MySQLConnString" applicationName="/" />
</providers>
</roleManager>
<sessionState mode="InProc" customProvider="MysqlSessionProvider">
<providers>
<add name="MysqlSessionProvider"
type="MySql.Web.SessionState.MySqlSessionStateStore, MySql.Web, Version=6.7.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"
connectionStringName="MySQLConnString" />
</providers>
</sessionState>
</system.web>
<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" />
</DbProviderFactories>
</system.data>

  5.  到目前为止,正常情况下或者使用CodeFirst或者使用Migration,应该都可以实现MVC3 在MySql下登录和注册模块的功能。:)恭喜已经接近成功了。

  6.  之所以不直接使用MVC4是因为MySql 对MVC4的支持并不是太好,时不时会出现很多问题;所以建议使用MVC3按以上步骤调试OK后再往MVC4上转换;所谓转换只是用MVC3的相关权限功能模块来替换掉MVC4的,主要包括AccountController,AccountModels,相关View,Global.asax。

  protected void Application_Start()
{
AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleTable.EnableOptimizations = true;
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterAuth();
BCRMonitor.RegisterGlobalMonitor(Server.MapPath(string.Format("~/photos/"))); //AreaRegistration.RegisterAllAreas(); // Use LocalDB for Entity Framework by default
// Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True"); // RegisterGlobalFilters(GlobalFilters.Filters);
//RegisterRoutes(RouteTable.Routes);
}

  7. 可能在上一步骤进行过程中会出现一些问题,耐心调试就OK了。

  注意事项:

    a.  mysql出现异常“ Every derived table must have its own alias” 此种问题在linq to mysql 的过程中也可能会遇到,只是linq to sql本身就是MS为Sqlserver开发的,当涉及到多表综合查询时,对mysql的支持就不太好了,如语句 return GetAll("").Where(x => x.Id == id).Take(1).SingleOrDefault(); 就会引起此类问题,可以换种linq写法规避。

     b.  在使用NuGet引用MySql.Data.Entity时注意其版本需要和packages.config,web.config,MySQL for Visual Studio 1.0.2 等中一致,否则也会提示错误:

System.IO.FileNotFoundException: 未能加载文件或程序集"MySql.Data, Version=6.1.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"或它的某一个依赖项。系统找不到指定的文件。

    c.  System.ArgumentException: 不支持关键字: “metadata”。 错误原因可能是connection string provider 未修改成 providerName="MySql.Data.MySqlClient"

MVC4,MVC3,VS2012+ entity framework Migration from Sqlserver to Mysql的更多相关文章

  1. 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表

    创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...

  2. Entity Framework 5中遇到的 mysql tinyint(1) 转换为 bool 的问题 (我用的是VS2013中的EF5版本)

    数据有一个字段,用的是 tinyint 长度是1  默认值为0 , 当用vs2013中的 EF5来生成 实体模型之后,看到这个列被标识为 bool 类型   Mysql官方参考文档关于布尔类型的说明: ...

  3. Entity Framework 6 Code First +MVC5+MySql/Oracle使用过程中的几个问题

    1. namespace Snapsia.Web.Models { using System; using System.Data.Entity; using System.ComponentMode ...

  4. Entity Framework插入中文数据到MySQL乱码问题

    1.MYSQL: 保证所有的的列都是UTF8格式. 2.在连接MySQL的连接字符串中,加入配置文件信息:Character Set=utf8 

  5. 在服务器中使用 Entity Framework 的 Migration 更新数据库

    在开发环境中,每次我们对要对数据库进行更改,比如增加修改表字段等.改好Entity类后,我们只需在Nuget程序包管理控制台运行 update-database 脚本却可: update-databa ...

  6. Asp.Net MVC4开发二: Entity Framework在Asp.Net MVC4中的应用

    ORM作为一种数据库訪问机制已广泛地应用于各种项目其中,在.Net开发中,应用比較广泛的ORM框架大致有以下几个: 官方支持的有:Linq to SQL.Entity Framework.三方的有:N ...

  7. MVC2、MVC3、MVC4、MVC5之间的区别 以及Entity Framework 6 Code First using MVC 5官方介绍教程

    现在MVC的技术日趋成熟,面对着不同版本的MVC大家不免有所迷惑 -- 它们之间有什么不同呢?下面我把我搜集的信息汇总一下,以便大家能更好的认识不同版本MVC的功能,也便于自己查阅. View Eng ...

  8. ASP.NET MVC4 & Entity Framework 6.0 IIS 部署出错解决方案

    博客地址 http://blog.csdn.net/foxdave 近期了解MVC4的时候弄了一个简单的小工程,使用Entity Framework作为Model,F5启动调试运行的时候没有问题,但是 ...

  9. [EF] 如何在 Entity Framework 中以手动方式设定 Code First 的 Migration 作业

    Entity Framework (简称 EF) 发展到现在, 版本已经进入 6.1.0, 距离我写的「在 VS2013 以 Code First 方式建立 EF 资料库」这篇文章已有半年的时间.如果 ...

随机推荐

  1. input submit button iOS webview browser diffrence

    最近做项目用到了webview, 在浏览器中显示正常的input[type="submit"]按钮, 加载到webview中后css里的设置都失效了, webview里渲染的是最原 ...

  2. struts2笔记09-动态方法调用

    1.action配置 <action name="testDynamic" class="com.test.actions.TestAction"> ...

  3. 001OC的结构解析

    Xcode通过.m扩展名来表示文件使用的是OC代码,C编译器处理.c文件,c++编译器处理cpp文件.所有编译工作默认由LLVM处理,这个编译器能够理解C语言的全部3个变体. #import<F ...

  4. 这些年,我收集的JavaScript代码(一)

    一.取URL中的参数 function getParameterByName(name) { var match = RegExp('[?&]' + name + '=([^&]*)' ...

  5. 算法分析-动态规划(cut_rod)

    什么是动态规划,我们要如何描述它? 动态规划算法通常基于一个递推公式及一个或多个初始状态. 当前子问题的解将由上一次子问题的解推出.使用动态规划来解题只需要多项式时间复杂度, 因此它比回溯法.暴力法等 ...

  6. C语言的本质(3)——整数的本质与运算

    C语言的本质(3)--整数的本质与运算 计算机存储的最小单位是字节(Byte),一个字节通常是8个bit.C语言规定char型占一个字节的存储空间.如果这8个bit按无符号整数来解释,则取值范围是0~ ...

  7. 为Spring添加REST功能

    1 关于REST 我的理解,REST就是将资源以最合适的形式在服务端和客户端之间传递. 系统中资源采用URL进行标识(可以理解为URL路径中带参数) 使用HTTP方法进行资源的管理(GET,PUT,P ...

  8. SQL中的去重操作

    if not object_id('Tempdb..#T') is null drop table #T Go Create table #T([ID] ),[Memo] nvarchar()) In ...

  9. T-SQL开窗函数

    开窗函数over() 用途一:排序order by ,row_number select *,RANK() over(order by english desc) from Score --根据英语成 ...

  10. bootstrap-js(2)下拉菜单

    1.下面的实例演示了在导航栏内和标签内的下拉菜单的用法: <!DOCTYPE HTML><html><head><link href="/style ...