所以我刚刚拿起了 VS2012,我想用 EF5 启动一个 ASP.NET MVC 4 应用程序。
我的主机没有 MSSQL,所以我必须使用 MySQL。
如何告诉我的应用应该使用 MySQL?(我要么想使用 devart MySQL 连接器,要么想使用来自 mysql.com 的连接器)
所以我刚刚拿起了 VS2012,我想用 EF5 启动一个 ASP.NET MVC 4 应用程序。
我的主机没有 MSSQL,所以我必须使用 MySQL。
如何告诉我的应用应该使用 MySQL?(我要么想使用 devart MySQL 连接器,要么想使用来自 mysql.com 的连接器)
您需要使用连接字符串、DbProviderFactory 和 MySql 连接器 6.5.4 的自定义 DatabaseInitializer 设置配置。我已经详细介绍了让 EF5 和 MySql 运行的完整步骤,包括我博客上的初始化程序代码。如果您需要 ASP.Net Membership Provider 解决方案,之前有人问过:ASP.NET Membership/Role providers for MySQL?我还将在此处发布完整的 EF5 MySql 解决方案的解决方案。
MySql 连接器当前不支持 EF 5 迁移,并且 ASP.NET 仅支持 MS SQL 而不是 MySql 上的 SimpleMembership(MVC4 默认值)。以下解决方案适用于 Code First。
步骤是:
<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.html 或http://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>
<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 工作:
@Html.Partial(“_LoginPartial”)
在共享的 _Layout 视图中替换为@Html.Partial(“_LogOnPartial”)
<add name="ConnectionString" providerName="MySql.Data.MySqlClient" connectionString="Data Source=127.0.0.1; port=3306; Initial Catalog=DbName; uid=root; pwd=*Password*;" />
安装包:
PM> Install-Package EntityFramework
PM> Update-Package EntityFramework
PM> Install-Package MySql.Data.Entity
网页配置
<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>