65.9K
CodeProject 正在变化。 阅读更多。
Home

在 DotNet Core 1.0 中使用 EF Core 和 MySQL

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2017年12月3日

CPOL

4分钟阅读

viewsIcon

10305

downloadIcon

150

在 DotNet Core 1.0 中使用 EF Core 与 MySQL 数据库进行交互。

引言

截至今天,AWS(Amazon Web Services)支持使用多种语言编写的 Lambda 函数,其中一种就是 DotNet Core,这很棒。然而,缺点是支持的版本是 1.0,而 DotNet Core 2.0 自 2017 年 8 月以来就已经发布,v1.1 自 2016 年 10 月以来也已经发布。本文将介绍使用 EF Core 在 DotNet Core 1.0 中与 MySQL 数据库进行交互。在下一篇文章中,我将介绍如何根据本文讨论的内容编写无服务器 Lambda 函数。

准备就绪

我使用的是 Windows 10 和 Visual Studio 2017 社区版。如果您仍在使用 Visual Studio 2015 或更早的版本,您真的应该升级,2017 社区版是免费的。

首先,我们需要安装 DotNet Core 1.0 SDK。您可以通过运行开发者命令提示符并输入以下命令来检查:

dotnet --version

您应该会看到打印出 1.0。如果您没有安装 DotNet Core,可以从控制面板中的“**添加/删除**”程序中“修改”Visual Studio 安装,或者直接运行“appwiz.cpl”。

接下来,您需要在网络上的某个位置或本地开发机器上运行 MySql。可以从 https://dev.mysqlserver.cn/downloads/mysql/ 免费下载 MySQL。

接下来,我们需要创建示例数据库。下载的 ZIP 文件包含数据库文件 *sampledb.sql*。在 MySQL Workbench 中打开此文件并运行,即可准备好示例数据库。

Code First 还是 DB First?

这个问题已经耗费了无数生命和时间。您应该先创建数据库,还是先创建领域类(也许是用 C#)?

在 Code First 方法中,您使用 C#、Java 或您使用的任何语言定义实体以及关系,之后您可以使用 Entity Framework 的数据库生成功能来创建数据库。

在 Database First 方法中,您首先定义数据库,然后可以使用 Visual Studio EDMX 设计器等工具,将数据库中的表拖放到 IDE 中,然后生成所需的实体类并建模关系。这里有个陷阱,Entity Framework Core 开箱即用地没有 EDMX 设计器。

我将在本文中采用的方法是先创建数据库,然后手动建模我的实体类。

准备项目

如果您在 Visual Studio 中创建新的 DotNet Core 项目,项目创建完成后,第一步是向正确的 MySql 数据提供程序和 EF 提供程序添加 Nuget 包引用。
在 Nuget 包管理器控制台中,输入

Install-Package MySql.Data.Core -version 7.0.4-IR-191
Install-Package MySql.Data.EntityFrameworkCore -version 7.0.4-IR-191

这应该会拉入使用 EF core 处理 MySQL 所需的所有内容。

从小处着手

我将首先建模 Blog 到 Comments 的关系,这是一个一对多的关系;一个博客可以有多个评论,一个评论只属于一个博客。

需要注意的重要事项是

  • Blog 类包含一个 Comment 对象集合。
  • Comment 类包含 BlogId,它提供了到博客的外键路径。
  • Comment 类还包含对关联 Blog 对象的引用。

接下来重要的是要建模这种关系,以便 EF 知道 BlogComment 是如何相关的。为此,我们会在 DbContextOnConfiguring 方法中进行挂钩,如下所示:

让我们尝试添加一个带 2 个评论的新博客。构建示例应用程序,并确保您已在 BlogDbContext 类的 GetConnectionString 方法中修改了连接到您的 MySQL 实例的正确信息。要填充示例博客,请键入以下命令运行程序:

dotnet blogsample -populate

希望不会出现任何异常。现在您可以使用以下命令检索填充的内容:

dotnet blogsample

输出

更大一些

我们要建模的最后一件事是 BlogCategories 之间存在的多对多关系。和上次一样,我们先定义类并修改现有类的一些属性。

需要注意的重要事项

  • 我们有一个类来表示第三个表,名为 BlogCategory,它包含 BlogCategory 的外键。
  • 它还包含对 BlogCategory 对象的引用。
  • Blog 类现在包含一个 BlogCategory 对象集合。
  • Category 类包含一个 BlogCategory 对象集合。

接下来是告知 EF BlogCategories 之间存在的关系。和上次一样,这在 DbContext 派生类的 OnConfiguring 方法中完成,如下所示:

我们使用以下流畅语法从 blog 中检索 categoriescomments

foreach (Blog blog in db.Blogs.Include(b => b.Comments).Include
        (b => b.BlogsCategories).ThenInclude(bg => bg.Category))	
{
	Console.WriteLine(blog);
	Console.WriteLine();
}

要填充 categories 和一个示例 blog,请使用 -populatecategories 选项运行程序。如果您现在不带任何参数运行程序,您将看到之前的博客以及带有示例 SQL 类的新博客。

关注点

在本文中,关系仅使用 Entity Framework 的流畅 API 定义。在使用此特定版本的 MySQL EF 提供程序时,我遇到了一些问题,例如 Core 1.0 的 MySQL nuget 包版本不兼容,以及使用属性样式定义不支持复合主键。我希望我能够提供一个可行的解决方案,帮助您开始在 DotNet Core 1.0 平台上使用 MySQL 和 EF Core。

历史

  • 版本 1 - 似乎一切正常 :)
© . All rights reserved.