欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Asp.Net Mvc中EntityFramework 使用Mysql数据库连接

程序员文章站 2022-05-05 13:21:12
...

首先打开VS 工具,新建一个Web应用程序

Asp.Net Mvc中EntityFramework 使用Mysql数据库连接

给项目起一个响亮的名字;

Asp.Net Mvc中EntityFramework 使用Mysql数据库连接

本项目选择的是MVC,所以选择MVC点击确定;

项目创建完成后,安装EntityFramework和Mysql驱动;

EntityFramework的安装地址:https://www.nuget.org/packages/EntityFramework/ 

可以直接在VS里使用NuGet搜索安装也可以在程序包管理器控制台(PM)使用命令安装,本文选择使用第二种安装方式。

打开上面地址如下:

Asp.Net Mvc中EntityFramework 使用Mysql数据库连接

安装命令:

Install-Package EntityFramework -Version 6.2.0

可以选择自己需要的版本进行安装,本文选择最新版本6.2.0。

打开控制台输入命令后回车:

Asp.Net Mvc中EntityFramework 使用Mysql数据库连接

最后后提示安装项目里,可以直接使用了。

下面再来安装MySql驱动

安装地址: https://www.nuget.org/packages/MySql.Data.Entity/ 使用的安装方法跟EntityFramework一样。就不多说了。

安装完成后可以写如何连接数据库了。

首先看下EntityFramework的官方文档怎么写的地址:https://msdn.microsoft.com/en-us/library/jj193542(v=vs.113).aspx

官方的的例子很多,这里主要讲如何连接Mysql数据。

这个地址打开后文章中首先要创建两个实体类:

我们在MysqlWeb项目中找到Models文件夹,创建两个类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Mvc.EF.MysqlWeb.Models
{
    public class Blog
    {
        public int BlogId { get; set; }
        public string Name { get; set; }

        public virtual List<Post> Posts { get; set; }
    }
}
namespace Mvc.EF.MysqlWeb.Models
{
    public class Post
    {
        public int PostId { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }

        public int BlogId { get; set; }
        public virtual Blog Blog { get; set; }
    }
}

然后开始写怎么连接数据库首先创建BloggingDbContext类继承DbContext

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using Mvc.EF.MysqlWeb.Models;

namespace Mvc.EF.MysqlWeb.Database
{
    public class BloggingDbContext : DbContext
    {
        public BloggingDbContext() : base("name=BlogContext")
        {

        }
        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }
    }
}

注意:DbContext需要引用System.Data.Entity;

红色部分是关键代码,给类写个构造方法,这个构造需要使用base来访问基类的构造,base里name=BlogContext是在WebConfig中的数据库访问配置;

WebConfig配置如下:

<configuration>

  <connectionStrings>
    <add name="BlogContext" providerName="MySql.Data.MySqlClient" connectionString="server=localhost;port=3306;database=blog;uid=root;password=root" />
  </connectionStrings>
  
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.10.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d">
      </provider>
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
      <add description=".Net Framework Data Provider for MySQL" invariant="MySql.Data.MySqlClient" name="MySQL Data Provider" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.10.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data></configuration>

配置中,除去connectionStrings节点是手动添加外都是在安装EF和Mysql驱动时自动生成的。生成的内容可以在Mysql官网查看。https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework60.html#connector-net-ef6-requirements

配置connectionStrings节点的数据库连接,注意:add的name一定要与DbContext中的一致。

配置完成后就可以根据实体类来生成数据库了。

首先在PM中输入Enable-Migrations命令,会在项目中生成Migrations文件夹,文件夹中有一个Configuration.cs的文件。

输入完命令回车会提示:

Migrations have already been enabled in project 'Mvc.EF.MysqlWeb'. To overwrite the existing migrations configuration, use the -Force parameter.

意思是已经在项目中启用了迁移。

下面以可以执行udpate-database命令了,但是执行覆盖命令需要将Configuration.cs中的AutomaticMigrationsEnabled = false;改为true;

然后再执行update-database结果如下图:

Asp.Net Mvc中EntityFramework 使用Mysql数据库连接

结果报错了。提示错误:System.TypeLoadException: 类型“MySql.Data.MySqlClient.MySqlProviderServices”违反了继承安全性规则。派生类型必须与基类型的安全可访问性匹配或者比基类型的安全可访问性低。

这个问题是由于mysql驱动的版本太高跟entityframework版本有冲突。目前使用的mysql.data.entity版本是6.10.6,把这个驱动删除掉换成6.9.11试试。

安装完成后再执行update-database命令提示如下:

No MigrationSqlGenerator found for provider 'MySql.Data.MySqlClient'. Use the SetSqlGenerator method in the target migrations configuration class to register additional SQL generators.

啥意思,经过查找资料是因为在BloggingDbContext里和WebConfig少了一些配置:

[DbConfigurationType(typeof(MySqlEFConfiguration))]
需要为MySQL设置新的DbConfiguration类

然后再WebConfig中:

<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
为entityFramework节点添加一个属性。然后再执行update-database命令:

Asp.Net Mvc中EntityFramework 使用Mysql数据库连接

好了,终于生成成功了,现在看下数据库生成的内容。

Asp.Net Mvc中EntityFramework 使用Mysql数据库连接

数据库中有个名称为dbo.__migrationhistory 的表很重要,记录的是从创建数据库开始的全部更新的记录