web-dev-qa-db-fra.com

ASP.NET MVC 4 EF5 avec MySQL

Je viens donc de choisir VS2012 et je souhaite démarrer une application ASP.NET MVC 4 avec EF5.

Mon hôte ne dispose pas de MSSQL, je dois donc utiliser MySQL.

Comment dire à mon application qu'elle doit utiliser MySQL? (Je veux utiliser le connecteur devart MySQL ou celui de mysql.com)

16
kasperhj

Vous devez configurer votre configuration avec une chaîne de connexion, DbProviderFactory et un DatabaseInitializer personnalisé pour MySql Connector 6.5.4. J'ai détaillé la étape complète pour obtenir EF5 et MySql à jouer, y compris le code pour les initialiseurs sur mon blog . Si vous avez besoin d’une solution de fournisseur d’appartenance ASP.Net, la question a déjà été posée: Adhésion à ASP.NET/Fournisseurs de rôles pour MySQL? Je vais publier la solution ici également pour une solution complète EF5 MySql.

Le connecteur MySql ne prend actuellement pas en charge la migration EF 5 et ASP.NET ne prend en charge que SimpleMembership (valeur par défaut de MVC4) sur MS SQL et non sur MySql. La solution ci-dessous est pour Code First.

Les étapes sont les suivantes:

  1. Prenez EF 5 de NuGet
  2. Prenez MySql.Data et MySql.Data.Entity depuis NuGet (6.5.4) ou MySql (6.6.4)
  3. Configurer un fournisseur de données MySql
  4. Configurer une chaîne de connexion MySql
  5. Créer un initialiseur de base de données MySql personnalisé
  6. Configurer l'initialiseur de base de données MySql personnalisé
  7. Configurez l'appartenance ASP.NET si vous en avez besoin

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>

Chaîne de connexion

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

Initialiseur de base de données

Si vous utilisez le connecteur MySql de NuGet (6.5.4), un initialiseur personnalisé est requis. Code disponible sur http://brice-lambson.blogspot.se/2012/05/using-entity-framework-code-first-with.html Ou sur http: // www .nsilverbullet.net/2012/11/07/6-étapes-à-obtenir-entité-cadre-5-travailler-avec-mysql-5-5/

Ajoutez ensuite ceci à la configuration

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

Adhésion 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>

Faites fonctionner le AccountController et les vues:

  1. Supprimez MVC 4 AccountController, AccountModels, le dossier de vue de compte et la vue partagée _LoginPartial
  2. Créer une nouvelle application Web MVC 3
  3. Copiez le contrôleur de compte MVC 3, les modèles de compte, le dossier de vue de compte et la vue partagée _LogOnPartial dans votre application MVC 4.
  4. Remplacez @Html.Partial(“_LoginPartial”) dans la vue _Layout partagée par @Html.Partial(“_LogOnPartial”)
26
agilejoshua
<add name="ConnectionString" providerName="MySql.Data.MySqlClient" connectionString="Data Source=127.0.0.1; port=3306; Initial Catalog=DbName; uid=root; pwd=*Password*;" />
1
Neha Katoch

Installer le paquet:

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>

Créer une classe de modèle

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

Créer un contexte de modèle:

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

Créer une classe de contrôleur

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());
        }
 }
}

Code ajouter la page de vue:

@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>
0
Ram Pukar