在 DotNet Core 1.0 中使用 EF Core 和 MySQL





0/5 (0投票)
在 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 知道 Blog
和 Comment
是如何相关的。为此,我们会在 DbContext
的 OnConfiguring
方法中进行挂钩,如下所示:
让我们尝试添加一个带 2 个评论的新博客。构建示例应用程序,并确保您已在 BlogDbContext
类的 GetConnectionString
方法中修改了连接到您的 MySQL 实例的正确信息。要填充示例博客,请键入以下命令运行程序:
dotnet blogsample -populate
希望不会出现任何异常。现在您可以使用以下命令检索填充的内容:
dotnet blogsample
输出
更大一些
我们要建模的最后一件事是 Blog
和 Categories
之间存在的多对多关系。和上次一样,我们先定义类并修改现有类的一些属性。
需要注意的重要事项
- 我们有一个类来表示第三个表,名为
BlogCategory
,它包含Blog
和Category
的外键。 - 它还包含对
Blog
和Category
对象的引用。 Blog
类现在包含一个BlogCategory
对象集合。Category
类包含一个BlogCategory
对象集合。
接下来是告知 EF Blog
和 Categories
之间存在的关系。和上次一样,这在 DbContext
派生类的 OnConfiguring
方法中完成,如下所示:
我们使用以下流畅语法从 blog
中检索 categories
和 comments
:
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 - 似乎一切正常 :)