MVC4,MVC3,VS2012+ entity framework Migration

系统 1770 0

MVC4,MVC3,VS2012+ entity framework Migration from Sqlserver to Mysql

在开发的初期个人认为因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。

      
         1
      
      
        protected
      
      
        void
      
      
         Application_Start()


      
      
         2
      
      
                {


      
      
         3
      
      
                    AreaRegistration.RegisterAllAreas();


      
      
         4
      
      
         5
      
      
                    WebApiConfig.Register(GlobalConfiguration.Configuration);


      
      
         6
      
      
                    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);


      
      
         7
      
      
                    RouteConfig.RegisterRoutes(RouteTable.Routes);


      
      
         8
      
                   BundleTable.EnableOptimizations = 
      
        true
      
      
        ;


      
      
         9
      
      
                    BundleConfig.RegisterBundles(BundleTable.Bundles);


      
      
        10
      
      
                    AuthConfig.RegisterAuth();


      
      
        11
      
                   BCRMonitor.RegisterGlobalMonitor(Server.MapPath(
      
        string
      
      .Format(
      
        "
      
      
        ~/photos/
      
      
        "
      
      
        )));


      
      
        12
      
      
        13
      
      
        //
      
      
        AreaRegistration.RegisterAllAreas();


      
      
        14
      
      
        15
      
      
        //
      
      
         Use LocalDB for Entity Framework by default


      
      
        16
      
      
        //
      
      
         Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True");


      
      
        17
      
      
        18
      
      
        //
      
      
         RegisterGlobalFilters(GlobalFilters.Filters);


      
      
        19
      
      
        //
      
      
        RegisterRoutes(RouteTable.Routes);
      
      
        20
      
               }
    

  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 等中一致,否则也会提示错误:

1
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"  

世界是你们的,也是我们的,但归根结底是他们的。
 
分类:  .NET

MVC4,MVC3,VS2012+ entity framework Migration from Sqlserver to Mysql


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论