ASP.NET MVC 4 EF5与MySQL相关。

16
所以我刚刚开始使用VS2012,想要开始一个带EF5的ASP.NET MVC 4应用程序。
我的主机没有MSSQL,所以我必须使用MySQL。
我该如何告诉我的应用程序它应该使用MySQL?(我想要使用devart MySQL连接器或者来自mysql.com的连接器)

可能是重复问题:https://dev59.com/AnVD5IYBdhLWcg3wI3-L - LukeP
2
不是很实际,因为EF5 MVC 4和.NET 4.5都是新的。 - kasperhj
3个回答

26
你需要使用连接字符串、DbProviderFactory和自定义DatabaseInitializer来设置你的配置,以适配MySql Connector 6.5.4。我在我的博客上详细介绍了获取EF5和MySql之间配合的全部步骤,包括初始化器的代码。如果你需要ASP.Net成员提供程序解决方案,可以参考MySQL的ASP.NET成员/角色提供程序?。我也会在这里发布一个完整的EF5 MySql解决方案。
目前MySql connector不支持EF5迁移,而ASP.NET仅支持在MS SQL上使用SimpleMembership(MVC4默认),不支持MySql。以下解决方案适用于Code First。
步骤如下:
  1. 从NuGet获取EF 5
  2. 从NuGet(6.5.4)或MySql(6.6.4)获取MySql.Data和MySql.Data.Entity
  3. 配置MySql数据提供程序
  4. 配置MySql连接字符串
  5. 创建自定义MySql数据库初始化器
  6. 配置自定义MySql数据库初始化器
  7. 如果需要,配置ASP.NET成员身份

DbProvider

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

连接字符串

<connectionStrings>
  <add name="ConnectionStringName" 
    connectionString="Datasource=hostname;Database=schema_name;uid=username;pwd=Pa$$w0rd;" 
    providerName="MySql.Data.MySqlClient" />
</connectionStrings>

数据库初始化器

如果您正在使用NuGet(6.5.4)中的MySql连接器,则需要自定义初始化器。可在http://brice-lambson.blogspot.se/2012/05/using-entity-framework-code-first-with.htmlhttp://www.nsilverbullet.net/2012/11/07/6-steps-to-get-entity-framework-5-working-with-mysql-5-5/获取代码。

然后将其添加到配置中。

<configSections>
  <section name="entityFramework" 
    type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, 
    EntityFramework, Version=5.0.0.0, Culture=neutral, 
    PublicKeyToken=b77a5c561934e089" />
</configSections>
<entityFramework>
  <contexts>
      <context type="Namespace.YourContextName, AssemblyName">
         <databaseInitializer 
           type="Namespace.YourChosenInitializer, AssemblyName">
         </databaseInitializer>
      </context>
    </contexts>
    <defaultConnectionFactory 
      type="MySql.Data.MySqlClient.MySqlClientFactory,MySql.Data" />
</entityFramework>

ASP.NET会员资格

<membership defaultProvider="MySqlMembershipProvider">
  <providers>
    <clear />
    <add name="MySqlMembershipProvider"
         type="MySql.Web.Security.MySQLMembershipProvider,
         MySql.Web, Version=6.5.4.0, PublicKeyToken=c5687fc88969c44d"
     autogenerateschema="true"
     connectionStringName="*NAME_OF_YOUR_CONN_STRING*"
     enablePasswordRetrieval="false"
     enablePasswordReset="true"
     requiresQuestionAndAnswer="false"
     requiresUniqueEmail="false"
     passwordFormat="Hashed"
     maxInvalidPasswordAttempts="5"
     minRequiredPasswordLength="6"
     minRequiredNonalphanumericCharacters="0"
     passwordAttemptWindow="10"
     passwordStrengthRegularExpression=""
     applicationName="/" />
  </providers>
</membership>

让AccountController和Views工作起来:

  1. 删除MVC 4中的AccountController、AccountModels、Account视图文件夹和_LoginPartial共享视图
  2. 创建一个新的MVC 3 Web应用程序
  3. 将MVC 3中的AccountController、AccountModels、Account视图文件夹和_LogOnPartial共享视图复制到您的MVC 4应用程序中
  4. 在共享的_Layout视图中用@Html.Partial(“_LogOnPartial”)替换@Html.Partial(“_LoginPartial”)

2
SimpleMembership提供程序(由MVC 4账户实现使用)不完全与数据库无关,并且其中包含一些MS Sql Server特定的语法,这将排除非Sql Server数据库... - agilejoshua
从NuGet(6.5.4)或MySql(6.6.4)中获取MySql.Data和MySql.Data.Entity。MySql.Data.Entity 6.6.4不存在。您是在建议使用MySql 6.6.4(它只有nuget上的.data和.web)吗?您能详细说明如何使用MySql 6.6.4吗? - Bart Calixto
1
v6.6.4是标准MYSQL Community Installer软件包的一部分。 http://cdn.mysql.com/Downloads/MySQLInstaller/mysql-installer-community-5.6.10.1.msi 或者 http://dev.mysql.com/downloads/mirror.php?id=412168 - Steve Johnson

1
<add name="ConnectionString" providerName="MySql.Data.MySqlClient" connectionString="Data Source=127.0.0.1; port=3306; Initial Catalog=DbName; uid=root; pwd=*Password*;" />

1
安装包:
PM> Install-Package EntityFramework
PM> Update-Package EntityFramework
PM> Install-Package MySql.Data.Entity

Web.config

<connectionStrings>
 <add name="DefaultConnection"
   providerName="MySql.Data.MySqlClient"
   connectionString="Data Source=localhost;port=3306;Initial Catalog=api_db;User Id=root;password=''"/>
</connectionStrings>

创建模型类。
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;

namespace LiteRemit.Models
{
    [Table("customers")]
    public class CustomerModel
    {
        [Key]
        public int CustomerId { get; set; }
        public string Name { get; set; }
        public string Country { get; set; }
    }
}

创建模型上下文:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace LiteRemit.Models
{
    public class MySqlCon : DbContext
    {
        //MySql Database connection String
        public MySqlCon() : base(nameOrConnectionString: "DefaultConnection") { }
        public virtual DbSet<CustomerModel> Customers { get; set; }
    }
}

创建控制器类。
using LiteRemit.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace LiteRemit.Controllers
{
    public class HomeController : Controller
    {
        MySqlCon _con;
        public HomeController()
        {
            _con = new MySqlCon();
        }

        public ActionResult Index()
        {
            return View(_con.Customers.ToList());
        }
 }
}

代码添加视图页面:
@using LiteRemit.Models
@model IEnumerable<CustomerModel>

<table border="1">
 @foreach (var item in Model)
 {
  <tr>
   <td>@Html.DisplayFor(modelItem => item.CustomerId)</td>
   <td>
    @Html.DisplayFor(modelItem => item.Name)
   </td>
   <td>@Html.DisplayFor(modelItem => item.Country)</td>
  </tr>
 }
</table>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接