ASP.NET MVC 4 EF5 с MySQL

Итак, я только что подобрал VS2012, и я хочу запустить приложение ASP.NET MVC 4 с EF5.

Мой хост не имеет MSSQL, поэтому мне нужно использовать MySQL.

Как сообщить моему приложению, что он должен использовать MySQL? (Я либо хочу использовать devart-соединитель MySQL, либо тот, что у mysql.com)

Ответ 1

Вам нужно настроить конфигурацию с помощью строки подключения DbProviderFactory и настраиваемого DatabaseInitializer для MySql Connector 6.5.4. Я подробно описал полный шаг для запуска EF5 и MySql, включая код для инициализаторов в моем блоге. Если вам требуется решение поставщика членства ASP.Net, перед ним спрашивали: Поставщики членства/роли ASP.NET для MySQL? Я опубликую решение здесь также для полного EF5 MySql решение.

Разъем MySql в настоящее время не поддерживает миграцию EF 5, и ASP.NET поддерживает только SimpleMembership (по умолчанию MVC4) на MS SQL, а не на MySql. Ниже приведено решение для кода First.

Шаги:

  • Возьмите EF 5 из NuGet
  • Grab MySql.Data и MySql.Data.Entity из NuGet (6.5.4) или MySql (6.6.4)
  • Настройка поставщика данных MySql
  • Настройка строки подключения MySql
  • Создайте пользовательский инициализатор базы данных MySql
  • Настроить пользовательский инициализатор базы данных MySql
  • Настройте членство 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>

Инициализатор базы данных

Если вы используете соединитель MySql от NuGet (6.5.4), тогда требуется пользовательский инициализатор. Код доступен на 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>

Членство в 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:

  • Удалить MVC 4 AccountController, AccountModels, папку просмотра аккаунта и общий доступ к _LoginPartial
  • Создайте новое веб-приложение MVC 3
  • Скопируйте MVC 3 AccountController, AccountModels, папку просмотра учетной записи и общий доступ к _LogOnPartial в ваше приложение MVC 4.
  • Замените @Html.Partial("_LoginPartial") в общем представлении _Layout с помощью @Html.Partial("_LogOnPartial")

Ответ 2

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

Ответ 3

Установить пакет:

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>