快速,持续,稳定,傻瓜式
支持Mysql,Sqlserver数据同步

在Azure中使用MySQL作为ASP MVC的模型存储

在线QQ客服:1922638

专业的SQL Server、MySQL数据库同步软件

介绍

Microsoft允许具有Dreamspark帐户的学生免费使用Azure虚拟主机。但是,使用MS SQL Server并非免费,但在Azure中MySQL支持免费(对于小型DB)。因此,为了使所有想要编写ASP MVC程序并使用Azure的学生受益,我研究了如何做到这一点。在网络上搜索,有很多文章包含了困惑的一部分,但是我找不到有效的示例。这个“ Frankenstein”程序从几篇文章中提取了一些代码,以创建一个简单的示例。我假设读者熟悉使用MS SQL Server构建MVC应用程序,并且只想知道如何在MySQL中进行交换。

背景

主代码的一个好一点的距离来这里,并在这里和解决“迁移历史表中,__migrationhistory问题是从哪里来这里。如果我的项目中有您不理解的代码,我强烈建议您仔细阅读这些文章。我没有重复那些文章中所有的好话。

使用代码

这是Contoso大学MVC示例的一个小版本,在许多文章中都有介绍。该示例仅以学生为数据,以消除混乱并专注于MySQL连接挑战。在粘贴我的代码时,各种类引用将是未定义的,但是新的VS2015可以很好地工作,只需右键单击并选择“快速修复”,然后让VS Using为您添加正确的语句。要非常小心StudentStudentsStudent是一个类和一个类文件。Students是数据库表。多余或缺少的“ s”将中断项目。

要使用VS2015重新创建它,请创建一个没有身份验证的新MVC项目。我建议使用与(ContosoMySQLAzure)相同的项目名称,以便剪切和粘贴我的代码更有可能工作。用以下代码替换“ Home Index.cshtm”视图中的代码:

@{
    ViewBag.Title = "Home Page";
}

<div class="jumbotron">
    <h1>Contoso University</h1>
</div>
<div class="row">
    <div class="col-md-4">
        <h2>Welcome to Contoso University</h2>
        <p>
            Contoso University is a sample application that
            demonstrates how to use Entity Framework 6 in an
            ASP.NET MVC 5 web application. This one uses MySQL.
        </p>
    </div>

</div>

从“工具”菜单中,选择“ NuGetPackage Manager”,然后选择“ Package Manager Console”。插入以下命令:

>Install-Package MySql.Data.Entity

这将加载与MySQL一起使用的Entity Framework代码。

现在,通过在“ 模型”文件夹中添加新的Student.cs类文件,为学生创建数据模型:

using System;
using System.Collections.Generic;

namespace ContosoMySQLAzure.Models
{
    public class Student
    {
        public int ID { get; set; }
        public string LastName { get; set; }
        public string FirstName { get; set; }
        public DateTime EnrollmentDate { get; set; }
    }
}

现在,通过将一个名为DAL的新文件夹添加到项目中来创建数据库上下文(处理和跟踪各种Entity Framework操作的类),然后在该文件夹中创建一个新的SchoolContext.cs类文件。

using ContosoMySQLAzure.Models;
using System.Data.Entity;

namespace ContosoMySQLAzure.DAL
{
    public class SchoolContext : DbContext
    {
        public SchoolContext() : base("SchoolContext")
        {
            Database.SetInitializer<SchoolContext>(new MyDbInitializer());
        }

        public DbSet<Student> Students { get; set; }
    }
}

DAL文件夹中添加另一个新类MyDbInitializer.cs该类用于预加载具有一些测试值的空DB。

using ContosoMySQLAzure.Models;
using System;
using System.Data.Entity;

namespace ContosoMySQLAzure.DAL
{
    // after you have the application running, you might want to use:
    // public class MyDbInitializer : CreateDatabaseIfNotExists<SchoolContext>

    // but while debugging, when you want a clean and seeded DB, use:
    public class MyDbInitializer : DropCreateDatabaseAlways<SchoolContext>
    {
        protected override void Seed(SchoolContext context)
        {
            // create 3 students to seed the database
            context.Students.Add(new Student 
            { ID = 1, FirstName = "Mark", LastName = "Richards", EnrollmentDate = DateTime.Now });
            context.Students.Add(new Student 
            { ID = 2, FirstName = "Paula", LastName = "Allen", EnrollmentDate = DateTime.Now });
            context.Students.Add(new Student 
            { ID = 3, FirstName = "Tom", LastName = "Hoover", EnrollmentDate = DateTime.Now });
            base.Seed(context);
        }
    }
}

编辑Web.config文件,并将连接字符串添加到基于Azure的MySQL实例。我使用Azure门户创建我的MySQL数据库。您需要事先创建一个Azure MySQL帐户,并创建一个名为的空数据库ContosoDataBase。创建该数据库时,获取并保存连接字符串,并使用适合您帐户的值在下面编辑我的代码。

<connectionStrings>
    <add name="SchoolContext" providerName="MySql.Data.MySqlClient" 

connectionString="Server=us-cdbr-azure-west-c.cloudapp.net; Database=ContosoDataBase; 
User Id=xxxxxxxxxxxxxx; Password=xxxxxxxx;" />
</connectionStrings>

注意:Web上许多早期的MySQL EF文章都对 Web.config文件中的<entityFramework>部分进行了更改。但是,对于这些当前版本的EF, Web.config中的所有其他内容都可以工作,而无需进行任何更改。

现在要启用迁移(如果模型更改)并允许EF创建日期基表来保存您的学生模型,您需要执行一些其他步骤。首先,再次从“工具”菜单中,选择“ NuGet软件包管理器”,然后选择“软件包管理器控制台”。插入以下命令:

>enable-migrations

这将在中创建一个新文件夹Migrations和一个新的类文件Configuration

实体框架代码优先使用“迁移历史记录”来跟踪模型更改并确保与数据库的一致性,但是“迁移历史记录”表__migrationhistory的主键对于MySql而言太大。我从这篇技巧中得到了解决方法。

迁移文件夹下,添加一个名为MySqlHistoryContext.cs的新类,并添加以下代码:

using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Migrations.History;

namespace ContosoMySQLAzure.Migrations
{
    public class MySqlHistoryContext : HistoryContext
    {
        public MySqlHistoryContext(DbConnection connection, string defaultSchema)
            : base(connection, defaultSchema)
        {

        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<HistoryRow>().Property(h => h.MigrationId).HasMaxLength(100).IsRequired();
            modelBuilder.Entity<HistoryRow>().Property(h => h.ContextKey).HasMaxLength(200).IsRequired();
        }
    }
}

在此迁移文件夹中,将Configuration.cs文件更改为:

namespace ContosoMySQLAzure.Migrations
{
    using DAL;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;

    internal sealed class Configuration : DbMigrationsConfiguration<SchoolContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;

            // register mysql code generator
            SetSqlGenerator("MySql.Data.MySqlClient", 
            	new MySql.Data.Entity.MySqlMigrationSqlGenerator());

            SetHistoryContextFactory("MySql.Data.MySqlClient", 
            (conn, schema) => new MySqlHistoryContext(conn, schema));
        }

        protected override void Seed(SchoolContext context)
        {

        }
    }
}

接下来,由于MySQL提供程序不支持实体框架迁移,因此创建一个自定义数据库初始化程序。向项目添加一个名为MySqlInitializer.cs的新类文件(不要与DAL文件夹中的MyDbInitializer.cs文件混淆),并使用以下代码:

using ContosoMySQLAzure.DAL;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;

namespace ContosoMySQLAzure
{
    public class MySqlInitializer : IDatabaseInitializer<SchoolContext>
    {
        public void InitializeDatabase(SchoolContext context)
        {
            if (!context.Database.Exists())
            {
                // if database did not exist before - create it
                context.Database.Create();
            }
            else
            {
                // query to check if MigrationHistory table is present in the database
                var migrationHistoryTableExists = 
                ((IObjectContextAdapter)context).ObjectContext.ExecuteStoreQuery<int>(
                string.Format(
                  "SELECT COUNT(*) FROM information_schema.tables 
                  WHERE table_schema = '{0}' AND table_name = '__MigrationHistory'",
                  "ContosoDataBase"));  // this last parameter is the name of your DB

                // if MigrationHistory table is not there 
                // (which is the case first time we run) - create it
                if (migrationHistoryTableExists.FirstOrDefault() == 0)
                {
                    context.Database.Delete();
                    context.Database.Create();
                }
            }
        }
    }
}

为了使这个新的MySqlInitializer数据库初始化程序起作用,您需要更改应用程序启动代码以注册该初始化程序。编辑Global.asax.cs并在此方法中添加一行:

protected void Application_Start()
{
    Database.SetInitializer(new MySqlInitializer());  // <<<<<<   add this line

    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);  // ...

现在,创建一个MVC控制器以使用此数据。右键单击Controller文件夹并执行Add New Scaffold Item,使用Entity Framework选择带有视图的MVC 5 Controller。该Model班是Student,数据上下文类SchoolContext,以及名称为StudentController

最后,编辑_Layout.cshtml文件以添加指向新控制器的链接:

<ul class="nav navbar-nav">
    <li>@Html.ActionLink("Home", "Index", "Home")</li>
    <li>@Html.ActionLink("About", "About", "Home")</li>
    <li>@Html.ActionLink("Contact", "Contact", "Home")</li>
    <li>@Html.ActionLink("Students", "Index", "Student")</li>
</ul>

它现在应该可以在Azure MySQL本地运行,也可以将应用程序推送到Azure并在云中全部运行。

图片1

历史

2015年10月1日:在Global.asax.cs文件中添加了所需的更改,并在此处更改了MyDbInitializer.cs的文本。

相关推荐

咨询软件
 
QQ在线咨询
售前咨询热线
QQ1922638