zoukankan      html  css  js  c++  java
  • ASP.NET MVC + MySQL で開発環境構築

    from:http://qiita.com/midori44/items/ef7cdd1d37c353e44b5f

    ASP.NET MVC & EntityFramework によるコードファースト開発環境を MySQL で構築してみます。
    と言っても今回はプロジェクトを作成して ASP.NET Identity によるユーザー認証を MySQL で動かすところまで。

    (2015.10.22 追記)
    Visual Studio 2015 + .NET Framework 4.6 でも動作確認。
    現在 beta 8 が公開中の ASP.NET 5 (ASP.NET MVC 6) は、まだ MySql.Data.Entity が対応していないので MySQL は使用できません。
    (追記ここまで)

    準備

    Visual Studio 2013 Community または Professional 以上を用意。
    Express for Web では拡張機能が使えないので注意。

    プロジェクト作成

    新規作成 -> プロジェクト -> Visual C# -> ASP.NET Webアプリケーション を選択。
    .NET Framework 4, 4.5 および 4.5.1 のサポートは 2016年1月12日 に終了するらしいので .NET Framework 4.5.2 を推奨。

    テンプレートは MVC を選択して、認証に「個人ユーザーアカウント」を使用。
    今回は「単体テストの追加」とAzureの「クラウド内のホスト」のチェックは外しておきます。
    WS0016.jpg

    これで ASP.NET アプリケーションが新規作成されました。
    デバッグ実行すれば、ユーザー登録・ログインといった ASP.NET Identity の認証機能を使用できることが確認できます。
    WS0017.jpg

    MySQL接続

    デフォルトでは SQL Server Compact が使用されているので、接続先を MySQL に変更してみます。

    MySql.Data.Entityのインストール・設定

    「NuGet パッケージの管理」から MySQL で検索して MySql.Data.Entity をインストールします(2015/4/14時点の最新版は6.9.6)。
    ついでに Microsoft ASP.NET MVC と EntityFramework も最新版にアップデートしておきます。

    次に Web.config を開きます(Viewsディレクトリ内の Web.config ではなくプロジェクト直下のほう)。
    entityFramework および system.data の設定は MySql.Data.Entity のインストール時に自動で追加されているので、connectionStrings のみ変更します。

    Web.config
    <connectionStrings>
        <!-- <add name="DefaultConnection" connectionString="Data Source=(LocalDb)v11.0;AttachDbFilename=|DataDirectory|aspnet-webapp-****.mdf;Initial Catalog=aspnet-webapp-****.;Integrated Security=True" providerName="System.Data.SqlClient" /> -->
        <add name="DefaultConnection" connectionString="server=127.0.0.1;port=3306;database=test;uid=root;password=;charset=utf8" providerName="MySql.Data.MySqlClient" />
    </connectionStrings>
    

    ここではXAMPP上で初期設定の MySQL を想定していますので、接続文字列のパラメータは環境に合わせて変更してください。

    マイグレーション

    続いて、マイグレーションを実行して認証で使用されるテーブルをコードから自動生成します。

    Enable-Migrations

    「パッケージマネージャー コンソール」から次のコマンドを実行します。
    Enable-Migrations

    Migration ディレクトリと Configuration.cs ファイルが作成されました。

    次に Add-Migration を実行するのですが、このまま実行すると以下のエラーが発生してしまいます。

    プロバイダー 'MySql.Data.MySqlClient' で MigrationSqlGenerator が見つかりませんでした。対象の移行構成クラスで SetSqlGenerator メソッドを使用して、追加の SQL ジェネレーターを登録してください。

    なので先ほど生成された Configuration.cs に、DbConfiguration の継承クラスを追加して MigrationSqlGenerator を登録します。

    Configuration.cs
    using MySql.Data.Entity
    
    internal sealed class Configuration : DbMigrationsConfiguration<ApplicationDbContext>
    {
        ...
    
        public class MysqlConfiguration : DbConfiguration
        {
            public MysqlConfiguration()
            {
                SetMigrationSqlGenerator(MySqlProviderInvariantName.ProviderName, () => new MySqlMigrationSqlGenerator());
            }
        }
    }
    

    これで Add-Migration が実行できるようになりました。

    Add-Migration

    「パッケージマネージャー コンソール」から次のコマンドを実行します。
    Add-Migration Initial

    Migration ディレクトリ内に 2015****_Initial.cs が作成されました。
    このファイルにコードから生成されたテーブルのカラム情報が保存されています。

    最後に Update-Database を実行するのですが、このまま実行すると以下のエラーが発生してしまいます。

    Specified key was too long; max key length is 767 bytes

    これは MySQL ではキーの長さの上限が 255 (utf-8のvarchar型)のためなので、キーとなるカラムの長さを 256 から 255 に修正します。

    2015****_Initial.cs
    public override void Up()
    {
        CreateTable(
            "dbo.AspNetRoles",
            c => new
                {
                    Id = c.String(nullable: false, maxLength: 128, storeType: "nvarchar"),
                    // maxLength: 256 -> 255
                    Name = c.String(nullable: false, maxLength: 255, storeType: "nvarchar"),
                })
            .PrimaryKey(t => t.Id)
            .Index(t => t.Name, unique: true, name: "RoleNameIndex");
    
        ...
    
        CreateTable(
            "dbo.AspNetUsers",
            c => new
                {
                    Id = c.String(nullable: false, maxLength: 128, storeType: "nvarchar"),
                    Email = c.String(maxLength: 256, storeType: "nvarchar"),
                    EmailConfirmed = c.Boolean(nullable: false),
                    PasswordHash = c.String(unicode: false),
                    SecurityStamp = c.String(unicode: false),
                    PhoneNumber = c.String(unicode: false),
                    PhoneNumberConfirmed = c.Boolean(nullable: false),
                    TwoFactorEnabled = c.Boolean(nullable: false),
                    LockoutEndDateUtc = c.DateTime(precision: 0),
                    LockoutEnabled = c.Boolean(nullable: false),
                    AccessFailedCount = c.Int(nullable: false),
                    // maxLength: 256 -> 255
                    UserName = c.String(nullable: false, maxLength: 255, storeType: "nvarchar"),
                })
            .PrimaryKey(t => t.Id)
            .Index(t => t.UserName, unique: true, name: "UserNameIndex");
    
        ...
    }
    

    もう一箇所、マイグレーション履歴を保持する __migrationhistory テーブルも修正する必要があります。
    先ほどの Configuration.cs に HistoryContext の継承クラスを作成してキーの長さを変更します。

    Configuration.cs
    public class MysqlConfiguration : DbConfiguration
    {
        public MysqlConfiguration()
        {
            SetMigrationSqlGenerator(MySqlProviderInvariantName.ProviderName, () => new MySqlMigrationSqlGenerator());
    
            SetHistoryContext("MySql.Data.MySqlClient", (dbConnection, defaultSchema) => new MysqlHistoryContext(dbConnection, defaultSchema));
        }
        public class MysqlHistoryContext : HistoryContext
        {
            public MysqlHistoryContext(DbConnection dbConnection, string defaultSchema)
                : base(dbConnection, defaultSchema)
            {
            }
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                base.OnModelCreating(modelBuilder);
    
                modelBuilder.Entity<HistoryRow>().Property(h => h.MigrationId).HasMaxLength(255).IsRequired();
                modelBuilder.Entity<HistoryRow>().Property(h => h.ContextKey).HasMaxLength(255).IsRequired();
            }
        }
    }
    

    これで Update-Database が実行できるようになりました。

    Update-Database

    「パッケージマネージャー コンソール」から次のコマンドを実行します。
    Update-Database

    以上で MySQL にデータベースが生成されます。
    WS0020.jpg

    デバッグ実行してユーザー登録すれば aspnetusers テーブルが更新されることが確認できます。

  • 相关阅读:
    Telink TLSR825x系列SDK增加串口打印log功能
    Telink BDT和烧录器EVK的使用
    Telink SDK IDE开发环境中函数链接跳转异常和实际编译项目显示灰色问题的解决
    Telink SDK 的编译设置(以825x系列的一个SDK为例)
    Telink IDE的下载和SDK的导入
    Git项目管理出现 .gitignore文件不起作用的解决
    char和signed char不同编译器下的使用反思
    动态内存的分配
    结构体和联合体
    C语言中利用clock设计一个简单的定时器
  • 原文地址:https://www.cnblogs.com/c-x-a/p/7090701.html
Copyright © 2011-2022 走看看